zoukankan      html  css  js  c++  java
  • hdu 1059

    题目大意:就是有价值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:
    Can't be divided.
    
    ",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:
    Can be divided.
    
    ",cnt);
            else
                printf("Collection #%d:
    Can't be divided.
    
    ",cnt);
        }
    }
  • 相关阅读:
    又过了一周
    本周学习情况
    5.12
    一周回顾
    npm修改全局包安装路径
    热力图之heatmap
    前端的发展历程
    idea打开maven项目没有别识别是maven项目
    nginx下部署vue项目
    WEB前端开发NodeJS
  • 原文地址:https://www.cnblogs.com/mltang/p/8799253.html
Copyright © 2011-2022 走看看