PS:背包类问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 120000+10;
int sum = 0;
int a[8];
int f[maxn];
//Accepted 624K 16MS C++ 1457B 2014-04-13 15:14:22
void all_bag(int c, int w) {
for(int i = c; i <= sum; i++) {
f[i] = max(f[i], f[i-c]+w);
}
}
void ZeroOneBag(int c, int w) {
for(int i = sum; i >= c; i--) {
f[i] = max(f[i], f[i-c]+w);
}
}
void mult_bag(int c, int w, int n) {
if(n*c >= sum) {
all_bag(c, w);
return;
}
int k = 1;
while(k < n) {
ZeroOneBag(k*c, k*w);
n -= k;
k *= 2;
}
ZeroOneBag(n*c, n*w);
}
int main()
{
int k = 1;
while(scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])==6) {
sum = 0;
for(int i = 1; i <= 6; i++) sum += a[i];
if(!sum) break;
sum = 0;
for(int i = 1; i <= 6; i++) {
sum += i*a[i];
}
if(sum&1) {
printf("Collection #%d:\nCan't be divided.\n\n",k++);
continue;
}
sum /= 2;
memset(f, 0, sizeof(f)); // init;
for(int i = 1; i <= 6; i++) {
if(a[i]) {
mult_bag(i, i, a[i]);
}
}
if(f[sum]==sum) printf("Collection #%d:\nCan be divided.\n\n",k++);
else printf("Collection #%d:\nCan't be divided.\n\n",k++);
}
return 0;
}