免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2546 | 回复: 1
打印 上一主题 下一主题

[算法] 01背包问题--划分成两个子集合,且保证每个集合的数字和是相等 [复制链接]

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-06 16:18 |只看该作者 |倒序浏览
对于从 1 到 N 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等
  1. #include<iostream>
  2. #include<malloc.h>
  3. using namespace std;

  4. int main()
  5. {
  6. int dyn[100];
  7. memset(dyn,0,100);
  8. int n,s;
  9. cin>>n;
  10. s=n*(n+1);
  11. if(s%4)
  12. {
  13.   cout<<0<<endl;
  14. }
  15. s/=4;
  16. int i,j;
  17. dyn[0]=1;
  18. for(i=1;i<=n;i++)//表示这个次选取的是数为i
  19. {
  20.   for(j=s;j>=i;j--)
  21.    [color=Red]dyn[j]+=dyn[j-i];[/color]//dyn[j-i]表示加起来等于j-i的组数,
  22. }                        //dyn[j]表示加起来等于j的组数
  23. cout<<dyn[s]/2<<endl;//由于交换两个子集合的位置被认为是同一种划分方案,所以最终结果为dyn[s]/2
  24. return 1;
  25. }
复制代码
标红一句有点没看明白,哪位帮忙提示一下,多谢!

论坛徽章:
0
2 [报告]
发表于 2015-01-19 20:05 |只看该作者
通过递归的方法遍历出所有的dyn[x],x from 1 to s。

标红的意思是,算出从和为i到s各种组合中带i的次数。这里我总觉得会重复很多次。

楼主你这代码哪里来的,memset都搞错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP