标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19495 Accepted Submission(s): 5481
// 少打换行 ans/=2写早了 数组开小了 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define maxn 60100 #define LL long long using namespace std; int a[10]; int d[maxn]; int ans; void init() { memset(d,0,sizeof(d)); } void CompletePack(int volume,int weight) { for(int i=volume;i<=ans;i++) d[i]=max(d[i],d[i-volume]+weight); } void ZeroPack(int volume,int weight) { for(int i=ans;i>=volume;i--) d[i]=max(d[i],d[i-volume]+weight); } void MultiplePack(int volume,int num) { if(volume*num>=ans) CompletePack(volume,volume); else { int k=1; while(k<=num) { ZeroPack(k*volume,k*volume); num-=k; k*=2; } ZeroPack(num*volume,num*volume); } } void solve() { for(int i=1;i<=6;i++) { if(a[i]!=0) MultiplePack(i,a[i]); } // for(int i=1;i<=ans;i++) // printf("%d %d\n",i,d[i]); } int main() { int _case=0; while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]) ) { init(); if(a[1]==0 && a[2]==0 && a[3]==0 && a[4]==0 && a[5]==0 && a[6]==0) break; ans=(a[1]*1+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6); if((ans%2!=0)) printf("Collection #%d:\nCan‘t be divided.\n\n",++_case); else { ans/=2; solve(); if(d[ans]==ans) printf("Collection #%d:\nCan be divided.\n\n",++_case); else printf("Collection #%d:\nCan‘t be divided.\n\n",++_case); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/xianbin7/p/4530780.html