poj解题报告——1014

来源:互联网 发布:阿里云os系统电视 编辑:程序博客网 时间:2024/05/29 09:47

       题意: 有分别价值为1,2,3,4,5,66种物品,输入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");        elseprintf ("Can't be divided.\n\n");    }}


0 0
原创粉丝点击