这里;http://acm.hdu.edu.cn/showproblem.php?pid=1059

题意是有价值分别为1,2,3,4,5,6的商品各若干个,给出每种商品的数量,问是否能够分成价值相等的两份.

联想到多重背包,稍微用二进制优化一下。(最近身体不适,压力山大啊)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define inf 70000
 5 using namespace std;
 6 int dp[inf];
 7 int sum;
 8 void pack(int price)
 9 {
10     for(int i = sum; i >= price; i--) dp[i] = max(dp[i], dp[i - price] + price);
11 }
12 int main()
13 {
14     int a[8],i,q=1,j;
15     while (~scanf("%d %d %d %d %d %d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]))
16     {
17         if (a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
18             break;
19         memset(dp,-inf,sizeof(dp));
20         dp[0]=0;
21         printf("Collection #%d:\n",q++);
22         sum=0;
23         for (i=1;i<=6;i++)
24             sum+=a[i]*i;
25         if (sum%2!=0)
26         {
27             printf("Can't be divided.\n\n");
28             continue;
29         }
30         sum/=2;
31         for (i=1;i<=6;i++)
32         {
33             if (i*a[i]>=sum)
34             {
35                 for (j=i;j<=sum;j++)
36                     dp[j]=max(dp[j],dp[j-i]+i);
37             }
38             else
39             {
40                 int k = 1;
41                 while(k < a[i])
42                 {
43                    pack(k * i);
44                    a[i] -= k;
45                    k += k;
46                 }
47                 pack(a[i] * i);
48             }
49         }
50         if (dp[sum]==sum)
51             printf("Can be divided.\n\n");
52         else
53             printf("Can't be divided.\n\n");
54     }
55     return 0;
56 }

转载于:https://www.cnblogs.com/JJCHEHEDA/p/4893049.html

hdu 1059 (多重背包) Dividing相关推荐

  1. hdu 3591 多重背包+完全背包练习题

    1 题目 http://acm.hdu.edu.cn/showproblem.php?pid=3591 题意:货币系统有 N 种不同面值的钱,每种钱的价值分别为 V1,V2,...,VN 一个人要买价 ...

  2. HDU 5445 (多重背包)

    题目链接:点击这里 题意: 有n个物品, m个卡车. 已知每种物品的能量, 体积和数量还有每种卡车的体积, 花费和数量, 求至少得到p能量的最少的卡车花费. 物品装卡车的时候能够切开装. 两次多重背包 ...

  3. HDU 2844 (多重背包)

    多重背包(二进制优化)模板 题意: 有n个硬币,每一个硬币有自己的数值Vi,其个数为Ci.不同硬币的不同组合能买到不同物品,问在1~V的区间内最多能买到多少不同种类的物品. 思路: 其实题意也就是求硬 ...

  4. hdu 2191 多重背包

    悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  5. hdu 2191 (多重背包二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...

  6. hdu 2191 多重背包入门

    悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

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

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

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

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

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

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

  10. hdu 1059 Dividing(多重DP)

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

最新文章

  1. unix实际用户ID和有效用户ID解析
  2. [置顶]IA32 architecture 学习笔记 (一)
  3. phpexcel设置AAA单元格,兼容大于702列数据
  4. 傅里叶变换(待总结)
  5. LeetCode题组:第7题-整数反转
  6. APK加壳【2】内存加载dex实现详解
  7. C++语言基础 —— STL —— 容器与迭代器 —— vector
  8. mulitp request
  9. 默认web地址_SpringMVC详解----Web层
  10. 【华为云技术分享】Batch Normalization (BN) 介绍
  11. mysql ip v4 v6_mysql IPv4 IPv6
  12. 多进程参数args元组方式与kwargs字典方式
  13. layui按条件隐藏表格列
  14. Unity 脚本的生命周期
  15. php之获取ip(网站地址)
  16. 二进制逆向工程师_逆向工程工具集
  17. pcs7服务器没有报警信息,PCS7服务器报警重启(工程师培训).pdf
  18. PYTHON-音视频合并方法
  19. Photoshop 使用技巧
  20. linux系统编译时make出错,centos 编译安装cmake和常见过程错误解决办法(linux系统均适用,以爬坑。。)...

热门文章

  1. 学习HTML5+CSS3的第二天
  2. centos 6上安装使用saltstack以及基础管理
  3. 使用开源软件 Mantis 实施缺陷跟踪的成功实践
  4. 为什要学习烹饪?学习烹饪迫在眉睫
  5. axios取消接口请求
  6. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
  7. Windows 7程序开发系列之一(任务栏篇)
  8. 【shell 练习5】编写简单的多级菜单
  9. 【bzoj1433】[ZJOI2009]假期的宿舍
  10. android小程序:计算圆面积