HDU-1059 Dividing 多重背包
2013-07-25 21:19
323 查看
啊!这题本来很简单,就是不细心,搞的我wa五六次啊,严重受到打击啊!多重背包转化成01背包和完全背包就可以了。
这个题,是说能分成开不,那么两个人所拥有的价值是总价值的一半。把背包的容量刚好看成总价的的一半v(本来可以看成无限大)但没必要,因为它刚好用v的体积。那么就是,在容量为v的条件下,看能否把背包装满。这样就可以用多重背包实现了。
这个题,是说能分成开不,那么两个人所拥有的价值是总价值的一半。把背包的容量刚好看成总价的的一半v(本来可以看成无限大)但没必要,因为它刚好用v的体积。那么就是,在容量为v的条件下,看能否把背包装满。这样就可以用多重背包实现了。
#include<stdio.h> #include<string.h> #define max(a,b)(a)>(b)?(a):(b) int dp[60005]; int v; inline void zero_pack(int c,int w) { for(int i=v;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+w); } void comp_pack(int c,int w) { for(int i=c;i<=v;i++) dp[i]=max(dp[i],dp[i-c]+w); } void Mult_pack(int c,int w,int m) { if(c*m>=v) comp_pack(c,w); else{ for(int k=1;k<m;k<<=1){ zero_pack(k*c,k*w); m-=k; } zero_pack(c*m,w*m); } } int main() { int a[7],cas=0; while(1){ v=0; cas++; for(int i=1;i<7;i++){ scanf("%d",&a[i]); v+=a[i]*i; } if(!v) break; if(v&1){ printf("Collection #%d:\nCan't be divided.\n\n",cas); continue; } v>>=1; memset(dp,0,sizeof(dp)); for(int i=1;i<7;i++) Mult_pack(i,i,a[i]); if(dp[v]==v) printf("Collection #%d:\nCan be divided.\n\n",cas); else printf("Collection #%d:\nCan't be divided.\n\n",cas); } 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 (多重背包)
- hdu1059 Dividing (多重背包)
- HDU 1059 Dividing【多重背包】
- Dividing (hdu 1059 多重背包)
- hdu 1059 Dividing(多重背包)