现在的位置: 首页 > 综合 > 正文

hdu 1059 Dividing

2018年12月29日 ⁄ 综合 ⁄ 共 675字 ⁄ 字号 评论关闭

有六种大理石块,每种价值最大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;

 

抱歉!评论已关闭.