HDU 1059多重背包
来源:互联网 发布:cad软件自学教程 编辑:程序博客网 时间:2024/05/06 02:20
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=200005;int cost[10],value[10];int f[maxn];int a[7];int v;void zeropack(int cost1,int value1){ for(int i=v; i>=cost1; i--) { f[i]=max(f[i],f[i-cost1]+value1); }}void completpack(int cost1,int value1){ for(int i=cost1; i<=v; i++) { f[i]=max(f[i],f[i-cost1]+value1); }}void multiplepack(int cost1,int value1,int acount1){ if(cost1*acount1>v) { completpack(cost1,value1); return; } else { int k=1; while(k<acount1) { zeropack(k*cost1,k*value1); acount1-=k; k*=2; } zeropack(acount1*cost1,acount1*value1); }}int main(){ int i,j; int tcase=0; while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]+a[2]+a[3]+a[4]+a[5]+a[6]) { int sum; sum=a[1]*1+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6; if(sum%2) { printf("Collection #%d:\n",++tcase); printf("Can't be divided.\n\n"); continue; } v=sum/2; memset(f,0,sizeof(f)); for(i=1; i<=6; i++) { multiplepack(i,i,a[i]); } if(f[v]==v) { printf("Collection #%d:\n",++tcase); printf("Can be divided.\n\n"); } else { printf("Collection #%d:\n",++tcase); printf("Can't be divided.\n\n"); } } return 0;}