#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int num[10];
int m;
int dp[60010];
int max(int a,int b)
{
return a>b?a:b;
}
void CompletePack(int v,int c)
{
int i;
for(i=c;i<=m;i++)
dp[i]=max(dp[i],dp[i-c]+v);
}
void ZeroOnePack(int v,int c)
{
int i;
for(i=m;i>=c;i--)
{
dp[i]=max(dp[i],dp[i-c]+v);
}
}
int main()
{
int cas=1;
while(cin>>num[1]>>num[2]>>num[3]>>num[4]>>num[5]>>num[6])
{
m=num[1]*1+num[2]*2+num[3]*3+num[4]*4+num[5]*5+num[6]*6;
if(m==0)
break;
int i;
printf("Collection #%d:\n",cas++);
if(m%2==1)
{
printf("Can't be divided.\n\n");
continue;
}
m=m/2;
memset(dp,0,sizeof(dp));
for(i=1;i<=6;i++)
{
if(num[i]==0)
continue;
if(num[i]*i>=m)
CompletePack(i,i);
else
{
int k=1;
while(k<=num[i])
{
ZeroOnePack(k*i,k*i);
num[i]=num[i]-k;
k=k<<1;
}
ZeroOnePack(num[i]*i,num[i]*i);
}
}
if(dp[m]!=m)
printf("Can't be divided.\n\n");
else
printf("Can be divided.\n\n");
}
return 0;
}
hdu1059
最新推荐文章于 2021-08-12 16:01:58 发布