1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Collection #1: Can't be divided. Collection #2: Can be divided.
又是问能不能均分==都做了多少遍了(⊙﹏⊙)b
你们猜这次我卡哪了??zero和complete调用位置写反了T^T输出了那么多中间变量才发现!!
RE一次又是因为没审题!数组开小了!你错多少次能记住??
居然是踩线过的==
/************** hdu1059 2015.11.3 717MS 1908K 2084 B G++ **************/ #include <iostream> #include<cstdio> #include<cstring> using namespace std; int dp[90000],value[10],cost[10],num[10],v; void zeropack(int cost,int value) { for(int i=v;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+value); // printf("zero "); } void complete(int cost,int value) { for(int i=cost;i<=v;i++) dp[i]=max(dp[i],dp[i-cost]+value); //printf("complete "); } void multipack(int cost,int value,int num) { if(num==0) return; if(cost*num>=v) { complete(cost,value); return; } int k=1; while(k<num) { zeropack(k*cost,k*value); num-=k; k*=2; } zeropack(num*cost,num*value); } int main() { //freopen("cin.txt","r",stdin); int cnt=1; while(~scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])) { for(int i=1;i<=6;i++) value[i]=i; for(int i=1;i<=6;i++) cost[i]=i; if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0&&num[5]==0&&num[6]==0) break; v=num[1]+num[2]*2+num[3]*3+num[4]*4+num[5]*5+num[6]*6; //for(int i=1;i<=6;i++) if(!num[i]) {value[i]=0;cost[i]=0;} //for(int i=1;i<=6;i++) printf("%d ",num[i]); if(v&1) { printf("Collection #%d:\nCan't be divided.\n\n",cnt++); continue; } v/=2; memset(dp,0,sizeof(dp)); for(int i=1;i<=6;i++) { if(num[i]==0) continue; //printf("i=%d ",i); multipack(cost[i],value[i],num[i]); // printf("i=%d ",i); // for(int j=cost[i];j<=v;j++)printf("i=%d j=%d dp[j]=%d ",i,j,dp[j]); // printf("\n"); } //printf("%d\n",dp[v]); // for(int i=1;i<=6;i++) printf("%d ",dp[i]); if(dp[v]!=v) printf("Collection #%d:\nCan't be divided.\n\n",cnt++); else printf("Collection #%d:\nCan be divided.\n\n",cnt++); } return 0; }