#include <stdio.h>
#include <string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int dp[70000];
int w[70000];
int a[7],sum,i,j,time=0,k,m,count,temp;
while(1)
{
time++;
sum=0;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
count=0;
for (i=1;i<=6;i++)
{
scanf("%d",&a[i]);//a[i]是第i堆有几块,即价值为i的有几块
sum=a[i]*i+sum;//求出总价值
k=1;
m=a[i];//记住块数,接下来要把m块分成1,2,4..n-2^k+1,其中每一小堆的价值为此时的价值(i)*每一小堆的块数k,所以初始k为1,后面不断*2
while(k<m)//用二进制法切割
{
w[count++]=k*i;
m-=k;
k*=2;//最后是m小于k*2的数,即一定大于k小于k*2
}
w[count++]=m*i;
}
if (sum==0)//说明输入的全是0
break;
if (sum%2)
printf("Collection #%d:\nCan't be divided.\n",time);
else
{
sum/=2;
for (i=0;i<count;i++)
for (j=sum;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
if (dp[sum]==sum)
printf("Collection #%d:\nCan be divided.\n",time);
else
printf("Collection #%d:\nCan't be divided.\n",time);
}
}
return 0;
}
poj1014
最新推荐文章于 2018-07-24 17:22:43 发布