思路:属于多重背包问题,应该利用多重背包模板进行解题。
#include <iostream>
#include<algorithm>
#include <stdio.h>
#define max(a,b) a>b?a:b;
using namespace std;
int dp[70000], bag;
void ZeroOnePack(int w, int v)//01背包
{
int i;
for (i = bag; i >= w; i--)
{
dp[i] = max(dp[i], dp[i - w] + v);
}
}
void CompletePack(int w, int v)//完全背包
{
int i;
for (i = w; i <= bag; i++)
{
dp[i] = max(dp[i], dp[i - w] + v);
}
}
void MultiplePack(int w, int v, int n)//多重背包
{
if (bag <= n * w)
{
CompletePack(w, v);
return;
}
else
{
int k = 1;
while (k <= n)
{
ZeroOnePack(k*w, k*v);
n= n - k;
k = 2 * k;//这里采用二进制思想
}
ZeroOnePack(n*w, n*v);
}
}
int main()
{
int i, t = 1, n[100],sum,v[100];
while (cin>>n[0]>>n[1]>>n[2]>>n[3]>>n[4]>>n[5]&&n[0]+n[1]+n[2]+n[3]+n[4]+n[5]!=0)
{
sum = 0;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < 6; i++)
{
v[i] = i + 1;
sum += n[i] * v[i];
}
if (sum % 2 !=0)
{
printf("Collection #%d:\nCan't be divided.\n\n", t++);
continue;
}
bag = sum / 2;
for (i = 0; i < 6; i++)
{
if (n[i])
MultiplePack(v[i],v[i], n[i]);
}
if (bag == dp[bag]) printf("Collection #%d:\nCan be divided.\n\n", t++);
else printf("Collection #%d:\nCan't be divided.\n\n", t++);
}
return 0;
}