码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1059

时间:2018-04-12 00:23:38      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:span   eof   硬币   下标   cstring   ems   容量   mem   main   

题目大意:就是有价值1、2、3、4、5、6的硬币各多少个,然后让你判断能否把他们分成价值相等的两部分。

        题目思路:目测dp,一看果然dp,完全背包,需要剪枝,硬币个数为容量,下标为value,用一个bool数组就可以标记是否有方案能构成当前下标的money。最后判断数组中下标为sum/2的值是否为为true即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool flag[120005];
int main()
{
    int a[7];
    int i,j,k,cnt = 0;
    while(scanf("%d%d%d%d%d%d",a+1,a+2,a+3,a+4,a+5,a+6))
    {
        if(a[1]==0 && a[1]==a[2] && a[2]==a[3] && a[3]==a[4] && a[4]==a[5] && a[5]==a[6])
            break;
        cnt++;
        memset(flag, 0, sizeof(flag));
        int sum = a[1]+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6;
        if(sum%2 == 1)
        {
            printf("Collection #%d:\nCan‘t be divided.\n\n",cnt);
            continue;
        }
        
        flag[0]=true;
        int maxn = 0;
        for(i=1;i<=6;++i)
        {
            for(j=maxn; j>=0; --j)
            {
                if(flag[j])
                {
                    for(k=1; k<=a[i] && j+k*i <= sum/2; ++k)
                    {
                        if(flag[j+k*i])
                            break;
                        flag[j+k*i] = true;
                    }
                }
            }
            maxn += a[i]*i;
        }
        if(flag[sum/2])
            printf("Collection #%d:\nCan be divided.\n\n",cnt);
        else
            printf("Collection #%d:\nCan‘t be divided.\n\n",cnt);
    }
}

 

hdu 1059

标签:span   eof   硬币   下标   cstring   ems   容量   mem   main   

原文地址:https://www.cnblogs.com/mltang/p/8799253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!