多重背包
#include <stdio.h>
#include <string.h>
#define mymax(a, b) (a>b) ? a:b
int c[7];
int dp[60000];
void ZeroOnePack(int c, int v) {
int i;
for (i=v; i>=c; --i)
dp[i] = mymax(dp[i], dp[i-c]);
}
void CompletePack(int c, int v) {
int i;
for (i=c; i<=v; ++i)
dp[i] = mymax(dp[i], dp[i-c]);
}
void MultiPack(int c, int n, int v) {
int k = 1;
if (c*n >= v) {
CompletePack(c, v);
return ;
}
while (k < n) {
ZeroOnePack(k*c, v);
n -= k;
k *= 2;
}
ZeroOnePack(n*c, v);
}
int main() {
int t = 0, total;
int i;
while ( 1 ) {
total = 0;
for (i=1; i<=6; ++i) {
scanf("%d", &c[i]);
total += c[i]*i;
}
if (total == 0)
break;
printf("Collection #%d:\n", ++t);
if (total & 1) {
printf("Can't be divided.\n\n");
continue;
}
total >>= 1;
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (i=1; i<=6; ++i) {
MultiPack(i, c[i], total);
if (dp[total])
break;
}
if (dp[total])
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}