题意:有6种大理石(marble,怀疑是不是大理石的意思。。。几块大理石也值得争?!),每种若干件且每种大理石有一定的价值(分别为1,2,3,4,5,6)。问能否分成价值相等的两份。

分析:多重背包。价值和费用相同。注意初始化。以下有两种解法。。。

代码1(多重背包):

 1 #include<iostream>
 2 using namespace std;
 3
 4 int f[60005],num[7];
 5 int sum,half;
 6 const int INF=0x3f3f3f3f;
 7
 8 int max(int a,int b){
 9     return a>b?a:b;
10 }
11
12 void ZeroOnePack(int c){
13     int i;
14     for(i=half;i>=c;i--)
15         f[i]=max(f[i],f[i-c]+c);
16 }
17
18 void CompletePack(int c){
19     int i;
20     for(i=c;i<=half;i++)
21         f[i]=max(f[i],f[i-c]+c);
22 }
23
24 int main()
25 {
26     //freopen("in.txt","r",stdin);
27     int i,j,k,cas=1;
28     while(1){
29         for(i=1,sum=0;i<=6;i++){
30             scanf("%d",&num[i]);
31             sum+=num[i]*i;
32         }
33         if(sum==0) break;
34         if(sum%2){
35             printf("Collection #%d:\n",cas++);
36             printf("Can't be divided.\n\n");
37             continue;
38         }
39         half=sum/2;
40         f[0]=0;
41         for(i=1;i<=half;i++)
42             f[i]=-INF;
43         for(i=k=1;i<=6;i++){
44             if(i*num[i]>=half)
45                 CompletePack(i);
46             else{
47                 while(k<num[i]){
48                     ZeroOnePack(k*i);
49                     num[i]-=k;
50                     k<<=1;
51                 }
52                 ZeroOnePack(num[i]*i);
53             }
54         }
55         printf("Collection #%d:\n",cas++);
56         if(f[half]==half) printf("Can be divided.\n\n");
57         else              printf("Can't be divided.\n\n");
58     }
59     return 0;
60 }

代码2(可行性解法):

 1 #include<iostream>
 2 using namespace std;
 3
 4 int f[7][60005],num[7];
 5 int sum,half;
 6
 7 int max(int a,int b){
 8     return a>b?a:b;
 9 }
10
11 int main()
12 {
13     //freopen("in.txt","r",stdin);
14     int i,j,cas=1;
15     while(1){
16         for(i=1,sum=0;i<=6;i++){
17             scanf("%d",&num[i]);
18             sum+=num[i]*i;
19         }
20         if(sum==0) break;
21         if(sum%2){
22             printf("Collection #%d:\nCan't be divided.\n\n",cas++);
23             continue;
24         }
25         half=sum/2;
26         f[0][0]=0;
27         for(i=1;i<=half;i++)
28             f[0][i]=-1;
29         for(i=1;i<=6;i++){
30             for(j=0;j<=half;j++)
31                 if(f[i-1][j]>=0)
32                     f[i][j]=num[i];
33                 else f[i][j]=-1;
34             for(j=0;j<=half-i;j++)
35                 if(f[i][j]>0)
36                     f[i][j+i]=max(f[i][j+i],f[i][j]-1);
37         }
38         printf("Collection #%d:\n",cas++);
39         if(f[6][half]>=0) printf("Can be divided.\n\n");
40         else              printf("Can't be divided.\n\n");
41     }
42     return 0;
43 }

转载于:https://www.cnblogs.com/acmer-roney/archive/2013/03/04/2943593.html

HDU 1059 Dividing相关推荐

  1. (step3.3) hdu 1059(Dividing——多重背包)

    题目大意:分别给出价值为1~6的石头的数量.问能否将这些石头等价值平分... 解题思路:多重背包 1)多重背包的典型描述是这样的:给出n种物品,背包的容量为V.每种物品的可用数量为num[i],所占体 ...

  2. HDU 1059 Dividing 多重背包

    这题想了想用母函数应该也可以做,不过得考虑一个细节,就是加起来的总和是否为奇数,我找了好久一直没找出错误,原来是没考虑奇数..  fuck  这种问题我怎么能不考虑奇数呢.....  啊 啊 啊啊 啊 ...

  3. hdu 1059 Dividing(多重DP)

    点击打开链接 题目意思: 有各种物品,各自的价值为1,2,3,4,5,6: 给出各自的数目,判断能否将其平分. 使用母函数的话,果断超时. 所以才用多重背包,这里需要剪枝一下了. #include&q ...

  4. 【HDU 1059】Dividing(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意:有6种物品,价值分别是1,2,3,4,5,6,每种物品有n[ i ]个,,问是否能将其平分 ...

  5. Dividing(HDU 1059)(多重背包_二进制优化)

    题目链接: 题意:有价值分别为1,2,3,4,5,6的marbles(大理石)若干,问是否能使这些marbles平分.[marbles总数不超过2e4(很明显这是一个大常数,所以用二进制优化来做)] ...

  6. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  7. dividing(多重背包)

    E - Dividing HDU - 1059 有6种宝石,价值分别为1,2,3,4,5,6. 现在有一个长度为6的数组,第i个数字表示价值为i的宝石的数量. 例如:[1,0,1,2,0,0]表示有一 ...

  8. 杭电60道DP问题总结(一)

    杭电60道DP问题总结: DP是一个很有艺术的思想.看似简单的背后却隐藏着深刻的含义. 题目连接地址:http://acm.hdu.edu.cn/problemclass.php?id=516& ...

  9. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

最新文章

  1. 分治——最近点对问题 hdu1007
  2. Dos批处理中符号作用大全
  3. 激光扫描仪的扫描方式
  4. 301转向和网址规范化
  5. python去重复的数据_Python中mysql查询重复数据并删除重复数据
  6. .NET Core加解密实战系列之——消息摘要与数字签名算法
  7. 使用QT的qmake工具生成VS工程
  8. go web框架_干货分享:六个知名的Go语言web框架
  9. 在Scala中评估val,var,lazy val和def构造时
  10. VC编程——QQ连连看外挂
  11. sit是什么环境_DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义
  12. WAV音乐文件无法修改标题
  13. oracle的month函数的使用方法,oracle next_day,add_month函数
  14. 做产品路线图规划用什么工具?
  15. android list嵌套list,Android开发日常-listVIiew嵌套webView回显阅读位置
  16. Respones请求重定向
  17. java百度天气接口解析_Java调用天气接口(百度天气)解析返回的JSON数据
  18. linux中test的用法,如何在Linux中使用test命令
  19. 软件工程课程作业--UON
  20. 无线打印服务器与什么打印机相配,网络打印服务器-本地打印机和网络打印机有什么区别? 爱问知识人...

热门文章

  1. golang获取结构体中的tag_26. Go 语言中结构体的 Tag 用法
  2. 【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态
  3. idea中war和war exploded的区别及修改jsp必须重新启动tomcat才能生效的问题(转)
  4. 删除数据文件—启动不了数据库--恢复数据库—启动数据库
  5. Maven 搭建多模块企业级项目
  6. AlphaGo技术剖析:揭开围棋大脑的神秘面纱
  7. Tomcat源码解析系列二:Tomcat总体架构
  8. Codeforces round 1098
  9. 第三方seo关键词优化工具推荐
  10. Python常见十六个错误集合,你知道那些?