首页 > 其他 > 详细

HDU 1059 Dividing

时间:2014-02-07 14:01:59      阅读:341      评论:0      收藏:0      [点我收藏+]

题目大意:有六堆石头,第i堆的价值为i,读入数据表示该堆石头的个数,现在要求得出是否可以分为价值相同的两堆。

题解:直接将石子数相加,如果为奇数则显然不可分,然后就是01背包的二进制拆分问题了。

bubuko.com,布布扣
#include <cstdio>
int main()
{
    int a[7],k,cnt=1;
    bool f[120000];
    while(true)
    {
        int sum=0;
        for(int i=1;i<=6;i++)
        {
            scanf("%d",&a[i]);
            sum += i * a[i];
        }
        if(sum == 0)
            break;
        printf("Collection #%d:\n",cnt++);
        if(sum % 2 != 0)
        {
            printf("Can‘t be divided.\n\n");
            continue;
        }
        sum /= 2;
        for(int i = sum;i > 0;i--)
            f[i] = false;
        f[0] = true;
        for(int i=1;i<=6;i++)
        {
            int t=a[i];
            for(k=1;k<=t;k<<=1)
            {
                int temp=k*i;
                for(int j=sum;j>=temp;j--)
                f[j]=f[j]||f[j-temp];
                t-=k;
            }
            if(t){
                int temp=t*i;
                for(int j=sum;j>=temp;j--)f[j]=f[j]||f[j-temp];
            }
        }
        if(f[sum])
            printf("Can be divided.\n\n");
        else
            printf("Can‘t be divided.\n\n");
    }
}
bubuko.com,布布扣

HDU 1059 Dividing

原文:http://www.cnblogs.com/forever97/p/3539192.html

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