#include <stdio.h>
#include <string.h>
int dp[60001];
int v[20000];
int num[7];
int main()
{
int i, j;
int sum;
int p, q;
int c;
c = 1;
while (1)
{
sum = 0;
for (i = 1; i <= 6; i++)
{
scanf("%d", &num[i]);
sum += num[i] * i;
}
if (sum & 1)
{
printf("Collection #%d:\n", c);
printf("Can't be divided.\n\n");
c++;
continue;
}
if (!num[1] && !num[2] && !num[3] && !num[4] && !num[5] && !num[6])
return 0;
p = 1;
for (i = 1; i <= 6; i++)
{
q = 1;
while (q < num[i])
{
v[p++] = i * q;
num[i] -= q;
q *= 2;
}
if (num[i])
v[p++] = num[i] * i;
}
memset(dp, 0, sizeof(dp));
for (i = 1; i < p; i++)
{
for (j = sum / 2; j >= v[i]; j--)
dp[j] = dp[j] > (dp[j - v[i]] + v[i]) ? dp[j] : (dp[j - v[i]] + v[i]);
}
printf("Collection #%d:\n", c);
if (dp[sum / 2] == sum / 2)
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
printf("\n");
c++;
}
return 0;
}
hduoj_1059(多重背包)
猜你喜欢
转载自blog.csdn.net/qq_32862515/article/details/80950133
今日推荐
周排行