题意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是(即没有物品),这程序结束,总物品的总个数不超过20000
代码如下
#include<stdio.h>
#include<string.h>
int a[7],sum,b[100],n;
int dp[60001];
void main()
{
int i,j,k,t=1,x;
while(1)
{
sum=0;
for(i=1;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum==0)
break;
printf("Collection #%d:\n", t++);
sum=0;
n=0;
for(i=1;i<=6;i++)
{
sum+=a[i]*i;
k=0;
b[n++]=k*i;
k++;
x=0;
while(x+k<a[i])
{
b[n++]=k*i;
x+=k;
k=k*2;
}
if(a[i]>x)
b[n++]=(a[i]-x)*i;
}
if(sum%2)
{
printf("Can't be divided.\n\n");
continue;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=0;i<n;i++)
for(j=sum/2;j>=b[i];j--)
if(dp[j-b[i]])
dp[j]=1;
if(dp[sum/2])
printf ("Can be divided.\n\n");
else
printf ("Can't be divided.\n\n");
}
}