首页 > 其他 > 详细

HDOJ1059(多重部分和问题)

时间:2015-08-01 20:23:36      阅读:196      评论:0      收藏:0      [点我收藏+]
#include<cstdio>
#include<cstring>
using namespace std;
const int SIZE=120000+16;
int a[6];
int dp[SIZE];
bool check()
{
    for(int i=0;i<6;i++)
        if(a[i]!=0)
            return true;
    return false;
}
int sum;

int main()
{
    int t=0;
    while(true)
    {
        sum=0;
        for(int i=0;i<6;i++)
        {
            scanf("%d",&a[i]);
            sum+=(i+1)*a[i];
        }
        if(!check())
            break;    
        
        printf("Collection #%d:\n",++t);    
        if(sum%2==1)
        {
            printf("Can‘t be divided.\n");
        }
        else
        {
            memset(dp,-1,sizeof(dp));
            int k=sum/2;
            dp[0]=0;
            for(int i=0;i<6;i++)
            {    
                for(int j=0;j<=k;j++)
                {
                    if(dp[j]>=0)
                    {
                        dp[j]=a[i];
                    }
                    else if(j<(i+1)||dp[j-(i+1)]<=0)
                    {
                        dp[j]=-1;    
                    }
                    else
                    {
                        dp[j]=dp[j-(i+1)]-1;
                    }            
                }
            }
            if(dp[k]>=0)
            {
                printf("Can be divided.\n");
            }
            else
            {
                printf("Can‘t be divided.\n");
            }
        }
        printf("\n");
    }
    return 0;
}

 

HDOJ1059(多重部分和问题)

原文:http://www.cnblogs.com/program-ccc/p/4694550.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!