多重背包,模板题,直接上代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10],dp[300005];
int main()
{
int kase = 1;
while(scanf("%d", &a[1]) != EOF)
{
int sum = a[1];
for(int i = 2; i <= 6; i++)
{
scanf("%d", &a[i]);
sum += i*a[i];
}
if(!sum) break;
printf("Collection #%d:\n", kase++);
if(sum & 1)
{
printf("Can't be divided.\n\n");
continue;
}
sum /= 2;
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= 6; i++)
{
if(i*a[i] >= sum)
{
for(int j = i; j <= sum; j++)
dp[j] = max(dp[j], dp[j-i] + i);
continue;
}
for(int k = 1; k <= a[i]; k *= 2)
{
for(int j = sum; j >= k*i; j--)
dp[j] = max(dp[j], dp[j - k*i] + k*i);
a[i] -= k;
}
if(a[i] > 0)
for(int j = sum; j >= a[i]*i; j--)
dp[j] = max(dp[j], dp[j - a[i]*i] + a[i]*i);
}
if(dp[sum] == sum) printf("Can be divided.\n");
else printf("Can't be divided.\n");
printf("\n");
}
return 0;
}