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.
一开始还觉得有点难写。。
后来AC才感觉自己编码能力已经很强了。。
主要是这个拆分函数就OK了
void solve() { for(int i=1;i<=6;i++) { int temp=0; while(n[i]>0) { if(n[i]>=ER[temp]) A[++tot]=i*ER[temp]; else A[++tot]=i*n[i]; n[i]=n[i]-A[tot]/i; temp++; } } }
完整代码如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <ctime> #include <algorithm> #include <iostream> #include <sstream> #include <string> #define oo 0x13131313 #define MAX 2100000000 using namespace std; void init() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); } int n[10]; int F[100001]; int ER[100]; int K; int A[600]; int tot=0; //总数 void YCL() { memset(F,0,sizeof(F)); tot=0; K=0; for(int i=1;i<=6;i++) { K+=i*n[i]; } for(int i=1;i<=K/2;i++) F[i]=MAX; F[0]=0; } void ER1() { ER[0]=1; for(int i=1;i<=15;i++) { ER[i]=ER[i-1]*2; } } void solve() { for(int i=1;i<=6;i++) { int temp=0; while(n[i]>0) { if(n[i]>=ER[temp]) A[++tot]=i*ER[temp]; else A[++tot]=i*n[i]; n[i]=n[i]-A[tot]/i; temp++; } } } int main() { // init(); int CASE=0; ER1(); //得到二的倍数 while(cin>>n[1]>>n[2]>>n[3]>>n[4]>>n[5]>>n[6]&&(n[1]||n[2]||n[3]||n[4]||n[5]||n[6])) { CASE++; YCL(); //计算K solve(); //拆分开始 if(K%2==0) { for(int i=1;i<=tot;i++) for(int j=K/2;j>=0;j--) { if(j-A[i]>=0) F[j]=min(F[j],F[j-A[i]]); } printf("Collection #%d:\n",CASE); if(F[K/2]!=MAX) { printf("Can be divided.\n\n"); } else { printf("Can't be divided.\n\n"); } } else { printf("Collection #%d:\n",CASE); printf("Can't be divided.\n\n"); } } return 0; }
恩 再补一道同类型的题目
5 20 go 5 8 think 3 7 big 7 4 read 2 6 write 3 5
15HintInput data is huge,please use “scanf(“%s”,s)”
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <ctime> #include <algorithm> #include <iostream> #include <sstream> #include <string> #define oo 0x13131313 using namespace std; int N,C; char buffer[30]; int map[20][22]; int ER[30]; int tot; int v[3000]; int w[3000]; int F[10001]; void ER1() { ER[0]=1; for(int i=1;i<=20;i++) { ER[i]=ER[i-1]*2; } } void input() { int a,b; tot=0; memset(map,0,sizeof(map)); memset(F,0,sizeof(F)); for(int i=1;i<=N;i++) { scanf("%s %d %d",buffer,&a,&b); map[a][b]++; } } void init() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); } void solve() { for(int i=1;i<=10;i++) for(int j=0;j<=10;j++) { int temp=0; while(map[i][j]>0) { if(map[i][j]>=ER[temp]) { v[++tot]=ER[temp]*i; w[tot]=ER[temp]*j; } else { v[++tot]=map[i][j]*i; w[tot]=map[i][j]*j; } { map[i][j]=map[i][j]-v[tot]/i; temp++; } } } } void dp() { for(int i=1;i<=tot;i++) for(int j=C;j>=0;j--) { if(j-w[i]>=0) F[j]=max(F[j],F[j-w[i]]+v[i]); } } int main() { // init(); ER1(); while(cin>>N>>C) { input(); solve(); dp(); printf("%d\n",F[C]); } return 0; }