标签:
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can‘t be divided. Collection #2: Can be divided.
/* Author: 2486 Memory: 1152 KB Time: 0 MS Language: G++ Result: Accepted */ #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <iostream> using namespace std; const int maxn=20005; int f[maxn<<2],v[maxn],w[maxn],n[maxn]; int a[6],mid; void zeroonepack(int w,int v) { for(int i=mid; i>=w; i--) { f[i]=max(f[i],f[i-w]+v); } } void completepack(int w,int v) { for(int i=w; i<=mid; i++) { f[i]=max(f[i],f[i-w]+v); } } void multipack(int w,int v,int n) { if(w*n>mid) { completepack(w,v); return ; } else { for(int k=1; k<n; k<<=1) { zeroonepack(k*w,k*v); n-=k; } zeroonepack(n*w,n*v); } } int main() { int number=1; while(~scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5])) { int sum=0; for(int i=0; i<6; i++) { sum+=a[i]*(i+1); } mid=sum>>1; for(int i=0; i<=sum; i++) { f[i]=-maxn; } f[0]=0; if(!sum)break; printf("Collection #%d:\n",number++); if(sum&1) { printf("Can't be divided.\n"); } else { for(int i=0; i<6; i++) { multipack(i+1,i+1,a[i]); } if(f[mid]==mid) { printf("Can be divided.\n"); } else { printf("Can't be divided.\n"); } } printf("\n"); } return 0; }
/* Author: 2486 Memory: 3828 KB Time: 47 MS Language: G++ Result: Accepted */ #include <cstdio> #include <string> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn=200005; int sizes[maxn<<2],value[maxn<<2]; int a[6]; int dp[maxn<<2]; int main() { int cas=0; while(~scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5])) { int sum=0,mid; for(int i=0; i<6; i++) { sum+=a[i]*(i+1); } if(!sum)break; printf("Collection #%d:\n",++cas); int count=0; mid=sum>>1; if(sum&1) { printf("Can't be divided.\n"); printf("\n"); continue; } for(int i=0; i<6; i++) { for(int j=1; j<=a[i]; j<<=1) { sizes[count]=j*(i+1); value[count++]=j*(i+1); a[i]-=j; } if(a[i]>0) { sizes[count]=a[i]*(i+1); value[count++]=a[i]*(i+1); } } memset(dp,0,sizeof(dp)); for(int i=0; i<count; i++) { for(int j=mid; j>=sizes[i]; j--) { dp[j]=max(dp[j],dp[j-sizes[i]]+value[i]); } } if(dp[mid]==mid) { printf("Can be divided.\n"); } else { printf("Can't be divided.\n"); } printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/qq_18661257/article/details/47107297