HDU 1059 Dividing——多重背包+二进制优化

8人阅读 评论(0) 收藏 举报
分类:

题意:6个物品,价值为1 2 3 4 5 6,每次告诉你每个物品有多少个,问你是否能选出一些物品,使得这些物品的价值为所有物品总价值的一半

思路:直接多重背包,加个二进制优化防超时

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 10;
int kase = 0, a[10], b[maxn];
bool dp[maxn];
int main() {
    while (~scanf("%d %d %d %d %d %d", &a[1],&a[2],&a[3],&a[4],&a[5],&a[6])) {
        if (a[1]+a[2]+a[3]+a[4]+a[5]+a[6] == 0) break;
        int sum = 0;
        for (int i = 1; i <= 6; i++) sum += a[i]*i;
        printf("Collection #%d:\n", ++kase);
        if (sum & 1) {
            printf("Can't be divided.\n\n"); continue;
        }
        int cnt = 0;
        for (int i = 1; i <= 6; i++) {
            int j = 0;
            while (a[i] >= (1<<j)) {
                b[++cnt] = (1<<j)*i;
                a[i] -= (1<<j);
                j++;
            }
            if (a[i] > 0) {
                b[++cnt] = a[i]*i;
            }
        }
        int mid = sum / 2;
        for (int i = 0; i <= mid; i++) dp[i] = false;
        dp[0] = true;
        for (int i = 1; i <= cnt; i++) {
            for (int j = mid; j >= b[i]; j--) {
                if (dp[j-b[i]]) dp[j] = true;
            }
        }
        if (dp[mid]) printf("Can be divided.\n");
        else printf("Can't be divided.\n");
        printf("\n");
    }
    return 0;
}

查看评论

hdu1059 Dividing(多重背包+二进制优化)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1059 题目大意: 有价值分别为1~6的弹珠,不同价值的弹珠有不同的数量。两个人要分成相同的价值,问...
  • aaaaacmer
  • aaaaacmer
  • 2015-09-18 11:05:11
  • 737

hdu2844 Coins(多重背包+二进制优化)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目大意: 有n种价值不同的硬币,他们的数量有限但不相同。现在要求出硬币组合,可组合出多少种...
  • aaaaacmer
  • aaaaacmer
  • 2015-09-18 14:10:08
  • 839

动态规划:HDU2844-Coins(多重背包的二进制优化)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • yopilipala
  • yopilipala
  • 2017-07-10 16:48:54
  • 391

hdu1059 Dividing 我的ACM我的梦,回顾篇 完全背包

题目链接在此
  • liuqiyao_01
  • liuqiyao_01
  • 2014-05-23 12:00:29
  • 2875

HDU 1059 Dividing(多重背包二进制优化)

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...
  • FK_ACM
  • FK_ACM
  • 2015-12-07 22:17:51
  • 179

HDU 1059 Dividing 多重背包二进制优化

原题: http://acm.hdu.edu.cn/showproblem.php?pid=1059题目大意: 有面值分别为1,2,3,4,5,6的6种货币,输入相应的数据,输出能否均分两份。 其...
  • qq_27508477
  • qq_27508477
  • 2015-07-28 19:48:27
  • 201

[HDU 1059] Dividing (多重背包+二进制优化)

链接HDU 1059题意给出6种硬币,价值分别为[1, 6],每种硬币有xi个,问是否能将这些硬币分为两组,每组硬币的价值为总价值的一半。题解是一种简化版的多重背包问题。先考虑这样一个问题,给出n个物...
  • zichenzhiguang
  • zichenzhiguang
  • 2016-10-07 18:37:22
  • 170

hdu 1059 Dividing 多重背包,二进制优化

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total...
  • wust_ZJX
  • wust_ZJX
  • 2015-03-28 19:32:33
  • 364

HDU 1059 Dividing (多重背包+二进制优化)

题目链接:HDU 1059 Dividing 题意:给出6种硬币的个数,他们的价值分别是1-6。问能否按价值平均分成2份。 多重背包问题,dp[]的意义是 背包容量为i的背包,最多大的价值。判断d...
  • u012377575
  • u012377575
  • 2014-09-05 18:03:44
  • 540

HDU 1059 Dividing (多重背包二进制优化)

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total...
  • HHH_go_
  • HHH_go_
  • 2017-05-10 22:23:57
  • 271
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 5878
    排名: 5445
    最新评论