Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int num[7],V,flag; int dp[100010]; void ZeroOnePack(int c,int w){ for(int i=V;i>=c;i--){ if(dp[i]<dp[i-c]+w) dp[i]=dp[i-c]+w; if(dp[i]==V){ //剪枝,当能够平分SumValue时退出 flag=1; return ; } } } void CompletePack(int c,int w){ for(int i=c;i<=V;i++){ if(dp[i]<dp[i-c]+w) dp[i]=dp[i-c]+w; if(dp[i]==V){ flag=1; return ; } } } void MultiplyPack(int c,int w,int amount){ if(c*amount>=V){ CompletePack(c,w); return ; } if(flag) return ; int k=1; while(k<=amount){ ZeroOnePack(k*c,k*w); if(flag) return ; amount-=k; k<<=1; } ZeroOnePack(amount*c,amount*w); } int main(){ //freopen("input.txt","r",stdin); int cases=0; while(1){ int sum=0; for(int i=1;i<=6;i++){ scanf("%d",&num[i]); sum+=i*num[i]; } if(sum==0) break; if(sum%2){ printf("Collection #%d:\n",++cases); printf("Can't be divided.\n\n"); continue; } V=sum/2; //printf("V=%d\n",V); flag=0; memset(dp,-1,sizeof(dp)); dp[0]=0; for(int i=1;i<=6;i++){ MultiplyPack(i,i,num[i]); if(flag) break; } //printf("flag=%d\n",flag); if(flag){ printf("Collection #%d:\n",++cases); printf("Can be divided.\n\n"); }else{ printf("Collection #%d:\n",++cases); printf("Can't be divided.\n\n"); } } return 0; }
DFS:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int num[7]; int sum,half; int flag; void DFS(int value,int pre){ if(flag) return ; if(value==half){ flag=1; return ; } for(int i=pre;i>=1;i--){ if(num[i]){ if(value+i<=half){ num[i]--; DFS(value+i,i); if(flag) return ; } } } } int main(){ //freopen("input.txt","r",stdin); int cases=0; while(1){ sum=0; for(int i=1;i<=6;i++){ scanf("%d",&num[i]); sum+=i*num[i]; } if(sum==0) break; if(sum%2){ printf("Collection #%d:\n",++cases); printf("Can't be divided.\n\n"); continue; } half=sum/2; flag=0; DFS(0,6); if(flag){ printf("Collection #%d:\n",++cases); printf("Can be divided.\n\n"); }else{ printf("Collection #%d:\n",++cases); printf("Can't be divided.\n\n"); } } return 0; }