hdu 1059 Dividing(多重背包)
2012-04-30 08:10
363 查看
题目:很六种岩石,每种的价值为1.2.3.4.5.6,每种的个数n[i],吧这些岩石分成两半,如果能分成价值相等的两半输出Can be divided.否则输出Can‘t
be divided.
分析:如果价值总和为奇数,直接输出can't,否则用V做总价值的一半,当做背包容量,再拿价值当做背包的体积,就是很明显的多重背包....
注意: wa了好几次,就是因为OneZeroPack(int k*cost,int
k*weight)没注意,吧k弄丢了
![](http://my.csdn.net/uploads/201204/30/1335744548_6354.png)
be divided.
分析:如果价值总和为奇数,直接输出can't,否则用V做总价值的一半,当做背包容量,再拿价值当做背包的体积,就是很明显的多重背包....
注意: wa了好几次,就是因为OneZeroPack(int k*cost,int
k*weight)没注意,吧k弄丢了
![](http://my.csdn.net/uploads/201204/30/1335744548_6354.png)
#include<iostream> #include<cstdio> using namespace std; int dp[150000]; int main() { int n[10],ca=1; while(1) { int sum=0,V=0; for(int i=1;i<=6;i++) { scanf("%d",&n[i]); sum+=n[i]; V+=n[i]*i; } if(sum==0) break; if(V%2==1) { printf("Collection #%d:\nCan't be divided.\n\n",ca++); continue; } V=V/2; memset(dp,0,sizeof(dp)); for(int i=1;i<=6;i++) if(n[i]!=0) { if(n[i]*i>=V) { for(int j=i;j<=V;j++) dp[j]=max(dp[j],dp[j-i]+i); } else { int k=1; while(k<n[i]) { for(int j=V;j>=k*i;j--)//是k*i不是i dp[j]=max(dp[j],dp[j-k*i]+k*i); n[i]-=k; k*=2; } for(int j=V;j>=n[i]*i;j--) dp[j]=max(dp[j],dp[j-n[i]*i]+n[i]*i); } } if(dp[V]==V) printf("Collection #%d:\nCan be divided.\n\n",ca++); else printf("Collection #%d:\nCan't be divided.\n\n",ca++); } system("pause"); return 0; }
相关文章推荐
- hdu1059 Dividing 多重背包
- hdu1059 Dividing(多重背包+二进制优化)
- HDU 1059 Dividing 多重背包
- HDU 1059 Dividing 多重背包动态规划
- hdu——1059——Dividing(多重背包)
- HDU 1059 Dividing(多重背包)
- HDU1059——Dividing多重背包
- HDU 1059 - Dividing(多重背包)
- 【HDU 1059 Dividing 多重背包 】
- HDU1059 Dividing(多重背包,二进制优化,模板题)
- HDU 1059 Dividing 多重背包
- HDU 1059 Dividing【多重背包】
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- hdu 1059 Dividing (多重背包详解)
- HDU 1059 Dividing 多重背包
- HDU-1059 Dividing (多重背包)
- hdu 1059 Dividing 多重背包
- hdu1059 Dividing (多重背包)
- Dividing (hdu 1059 多重背包)
- hdu 1059 Dividing(多重背包)