#include<cstdio>
#include<cstring>
#define MIN(x,y) ((x)>(y)?(y):(x))
#define MAX(x,y) ((x)>(y)?(x):(y))
int dp[42000];
int n[8];
int main()
{
int s=1;
while(~scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]))
{
int sum;
if((n[1]+n[2]+n[3]+n[4]+n[5]+n[6])==0)
break;
sum=1*n[1]+2*n[2]+3*n[3]+4*n[4]+5*n[5]+6*n[6];
// printf("sum=%d\n",sum);
if(sum%2)
printf("Collection #%d:\nCan't be divided.\n\n",s++);
else
{
for(int i=0;i<=sum/2;i++)
dp[i]=0;
for(int i=1;i<=6;i++)
{
int num=n[i];
for(int k=1;num>0;k<<=1)
{
int mul=MIN(k,num);
for(int j=sum/2;j>=i*mul;j--)
dp[j]=MAX(dp[j],dp[j-i*mul]+i*mul);
num-=mul;
}
}
if(dp[sum/2]==sum/2)
printf("Collection #%d:\nCan be divided.\n\n",s++);
else
printf("Collection #%d:\nCan't be divided.\n\n",s++);
}
}
}
hdu 1059 背包
最新推荐文章于 2024-10-01 18:52:56 发布