hdu 1059 Dividing

来源:互联网 发布:有关作文的软件 编辑:程序博客网 时间:2024/05/22 09:35

有六种大理石块,每种价值最大20000,按总价值进行平分

不需要按每种价值的大理石多大20000块进行平分,只需要对一个最低度的大理石数n(0<=n<=a[i])进行平分,其余部分可以直接平分,显然n是偶数

经过测试n=6;

 

 

#include<stdio.h>#include<string.h>int main(){    int dp[130],i,j,a[7],v[50],k,sum,t=0;    while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]||a[2]||a[3]||a[4]||a[5]||a[6])    {        memset(dp,0,sizeof(dp));        k=0;sum=0;t++;        for(i=1;i<=6;i++)        {            if(a[i]!=0&&a[i]%6==0)                a[i]=6;            else a[i]=a[i]%6;            for(j=0;j<a[i];j++)            {              v[k++]=i;sum+=i;            }        }        dp[0]=1;        printf("Collection #%d:\n",t);        if(sum%2==1){printf("Can't be divided.\n\n");continue;}        for(i=0;i<k;i++)        {            for(j=sum;j>=v[i];j--)                if(dp[j-v[i]]==1)                    dp[j]=1;        }        if(dp[sum/2]==1)printf("Can be divided.\n\n");        else printf("Can't be divided.\n\n");    }    return 0;


 

原创粉丝点击