hdoj 2844 Coins(多重背包)
来源:互联网 发布:梧桐一叶落而天下知秋 编辑:程序博客网 时间:2024/06/08 06:05
Coins(链接)
Sample Input
3 101 2 4 2 1 12 51 4 2 10 0
Sample Output
84
把第i种物品换成Mi件01背包中的物品,则得到了物品数为ΣMi的01背包问题。
我们可以通过二进制的拆分方法对其优化。对每i件物品,拆分的策略为:新拆分的物品的重量等于1件,2件,4件,..,(2^(k - 1)),Num[i] - (2^(k - 1))件,其中k 是满足Num[i] - 2^k + 1 > 0 的最大整数。
注意:
(1)最后一个物品的件数的求法和前面不同,其直接等于 该物品的最大件数 - 前面已经分配之和。
(2)分成的这几件物品的系数和为Num[i],表明第i种物品取的件数不能多于Num[i]。
举例:某物品为13件,则其可以分成四件物品,其系数为1,2,4,6.这里k = 3。
使用二进制的前提还是使用二进制拆分能保证对于0,,,Num[i]间的每一个整数,均可以用若干个系数的和表示。
#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f;int f[100100];int value[110],num[110];int n,V;void ZeroOnePack(int v){ for(int i=V;i>=v;i--) { f[i]=max(f[i],f[i-v]+v); }}void CompletePack(int v){ for(int i=v;i<=V;i++) { f[i]=max(f[i],f[i-v]+v); }}void MultiplePack(int value,int num){ int k=1; if(value*num>V) { CompletePack(value); return; } while(k<num) { ZeroOnePack(k*value); num -= k; k<<=1; //就是k*=2; } ZeroOnePack(num * value);}int main(){ int n,m; while(scanf("%d%d",&n,&V)) { if(n==0&&V==0) break; memset(f,0,sizeof(f)); for(int i=0;i<n;i++) scanf("%d",&value[i]); for(int i=0;i<n;i++) scanf("%d",&num[i]); for(int i=0;i<n;i++) { MultiplePack(value[i],num[i]); } int ans=0; for(int i=1;i<=V;i++) if(f[i]==i) ans++; printf("%d\n",ans); } return 0;}
阅读全文
0 0
- hdoj 2844 Coins(多重背包)
- hdoj-2844-Coins【多重背包】
- HDOJ题目2844 Coins(二维多重背包)
- hdoj 2844 Coins【多重背包】【dp】
- (DP,多重背包) Coins --HDOJ
- Coins(多重背包)
- Coins(多重背包)
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
- HDU 2844 Coins(多重背包)
- hdu 2844 Coins (多重背包)
- hdu 2844 Coins(多重背包优化)
- [ACM] hdu 2844 Coins (多重背包)
- HDU 2844 Coins (多重背包)
- HDU 2844 Coins(多重背包)
- HDU 2844 Coins (多重背包)
- hdu 2844 Coins(多重背包)
- HDU 2844 Coins (多重背包)
- HDU 2844 Coins (多重背包)
- 简单逻辑电路的设计
- 【python学习记录】-3-Python图像处理库:Pillow 初级教程
- 使用SVG打造可交互的自定义地图
- 测试手机闪存读写速度
- HDU 1727 Hastiness(模拟)
- hdoj 2844 Coins(多重背包)
- Oracle数据库的表空间
- 7.C语言(5)
- 分别显示用float和double指数记数法所能表示的最大值和最小值 以一个最高有效位为1的二进制数字开始,用有符号右移操作符对其进行右移,直至所有二进制位都被移除为止,每移一位都要使用Integer
- Handler图片自动轮播
- JAVA-"abstract"与"接口(interface)"
- C++ 二叉树建立,遍历
- android 倒计时控件布局
- ValueError: invalid literal for int() with base 10: '7.8000000e+02'