#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200005;
int cost[10],value[10];
int f[maxn];
int a[7];
int v;
void zeropack(int cost1,int value1)
{
for(int i=v; i>=cost1; i--)
{
f[i]=max(f[i],f[i-cost1]+value1);
}
}
void completpack(int cost1,int value1)
{
for(int i=cost1; i<=v; i++)
{
f[i]=max(f[i],f[i-cost1]+value1);
}
}
void multiplepack(int cost1,int value1,int acount1)
{
if(cost1*acount1>v)
{
completpack(cost1,value1);
return;
}
else
{
int k=1;
while(k<acount1)
{
zeropack(k*cost1,k*value1);
acount1-=k;
k*=2;
}
zeropack(acount1*cost1,acount1*value1);
}
}
int main()
{
int i,j;
int tcase=0;
while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]+a[2]+a[3]+a[4]+a[5]+a[6])
{
int sum;
sum=a[1]*1+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6;
if(sum%2)
{
printf("Collection #%d:\n",++tcase);
printf("Can't be divided.\n\n");
continue;
}
v=sum/2;
memset(f,0,sizeof(f));
for(i=1; i<=6; i++)
{
multiplepack(i,i,a[i]);
}
if(f[v]==v)
{
printf("Collection #%d:\n",++tcase);
printf("Can be divided.\n\n");
}
else
{
printf("Collection #%d:\n",++tcase);
printf("Can't be divided.\n\n");
}
}
return 0;
}
HDU 1059多重揹包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.