标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 68769 | Accepted: 17955 |
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.
Source
// // main.cpp // poj1014 // // Created by Candy on 9/21/16. // Copyright © 2016 Candy. All rights reserved. // #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2e4*6+5; int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘; c=getchar();} return x*f; } int n[10],sum=0,cnt=0; int f[N]; inline void zp(int v){ for(int i=sum;i>=v;i--) f[i]|=f[i-v]; } inline void cp(int v){ for(int i=v;i<=sum;i++) f[i]|=f[i-v]; } void mp(int v,int c){ if(c*v>sum) {cp(v);return;} int k=1; while(k<c){ zp(k*v); c-=k; k*=2; } zp(c*v); } int main(int argc, const char * argv[]) { while(true){ ++cnt; sum=0; memset(f,0,sizeof(f)); f[0]=1; int flag=1; for(int i=1;i<=6;i++) {n[i]=read();sum+=i*n[i];if(n[i]) flag=0;} if(flag) break; if(sum%2) { printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); continue; } sum/=2; for(int i=1;i<=6;i++) mp(i,n[i]); if(!f[sum]) printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); else printf("Collection #%d:\nCan be divided.\n\n",cnt); } return 0; }
// // main.cpp // poj1014 // // Created by Candy on 9/21/16. // Copyright © 2016 Candy. All rights reserved. // #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2e4*6+5; int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘; c=getchar();} return x*f; } int n[10],v[10],sum=0,cnt=0; int f[10][N]; void mpAble(){ memset(f,-1,sizeof(f)); f[0][0]=0; for(int i=1;i<=6;i++){ for(int j=0;j<=sum;j++){ if(f[i-1][j]>=0) f[i][j]=n[i]; else f[i][j]=-1; } for(int j=v[i];j<=sum;j++) if(f[i][j-v[i]]>0) f[i][j]=max(f[i][j],f[i][j-v[i]]-1); } } int main(int argc, const char * argv[]) { while(true){ ++cnt; sum=0; memset(f,0,sizeof(f)); int flag=1; for(int i=1;i<=6;i++){ n[i]=read();v[i]=i;sum+=i*n[i]; if(n[i]) flag=0; } if(flag) break; if(sum%2) { printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); continue; } sum/=2; mpAble(); if(f[6][sum]==-1) printf("Collection #%d:\nCan‘t be divided.\n\n",cnt); else printf("Collection #%d:\nCan be divided.\n\n",cnt); } return 0; }
标签:
原文地址:http://www.cnblogs.com/candy99/p/5894654.html