HDU-1059-Dividing
2013-07-06 20:51
155 查看
经典的背包问题,看了背包九讲以后做的,这个题是个多重背包,需要转换为01背包
代码:
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=120001; int dp[maxn],a[7],sum; void CompletePack(int cost) { for(int i=cost;i<=sum;i++) dp[i]=max(dp[i-cost]+cost,dp[i]); } void ZeroOnePack(int cost) { for(int i=sum;i>=cost;i--) dp[i]=max(dp[i-cost]+cost,dp[i]); } void Multiplay(int cost,int amount) { if(cost*amount>=sum) CompletePack(cost); else { int k=1; while(k<amount) { ZeroOnePack(k*cost); amount-=k; k<<=1; } } ZeroOnePack(amount*cost); } int main() { int cas=1; while(scanf("%d",&a[1])!=EOF) { sum=a[1]; memset(dp,0,sizeof(dp)); for(int i=2;i<=6;i++) { scanf("%d",&a[i]); sum+=a[i]*i; } if(!sum) break; printf("Collection #%d:\n",cas++); if(sum&1) printf("Can't be divided.\n"); else { sum/=2; for(int i=1;i<=6;i++) Multiplay(i,a[i]); if(dp[sum]==sum) printf("Can be divided.\n"); else printf("Can't be divided.\n"); } printf("\n"); } return 0; }
相关文章推荐
- HDU1059 && POJ1014 :Dividing(多重背包)
- HDU 1059 Dividing 多重背包
- HDU 1059 Dividing
- poj1014 hdu1059 Dividing 多重背包
- hdu1059 Dividing (多重背包) 经典
- hdu 1059 Dividing
- hdu 1059 Dividing
- HDU_1059 Dividing 【多重背包】
- 【hdu 1059】Dividing
- HDU 1059 Dividing (多重背包二进制优化)
- HDU 1059 Dividing
- HDU 1059 Dividing
- HDU 1059 Dividing(多重背包 , 二进制优化形成01背包)
- hdu 1059 Dividing 多重背包
- HDU 1059 Dividing
- hdu 1059 Dividing--DP-多重背包问题
- 【HDU 1059】Dividing 【多重背包 两种解法】
- hdu 1059 Dividing 多重背包
- HDU 1059 Dividing 多重背包
- ZOJ 1149 || POJ 1014 || HDU 1059 Dividing