HDU - 1059 Dividing(完全背包+多重背包)

来源:互联网 发布:万捷网络验证系统 编辑:程序博客网 时间:2024/06/08 13:36

题目大意:有6种硬币,价值分别是1,2,3,4,5,6。现在给出每种硬币的数量,问能否均分,使得两个人得到的价值一样

解题思路:如果能得到平均数,就表示能均分
考虑一下两种情况,如果价值*数量>=平均数/2,那就可以当成完全背包来考虑了
反之,就得当成多重背包考虑

#include <cstdio>#include <cstring>using namespace std;const int N = 60010;int num[6];int Sum;bool vis[N];void bag(int w, int n) {    if (w * n >= Sum) {        for (int i = w; i <= Sum; i++)             if (vis[i - w]) vis[i] = true;    }    else {        for (int i = 1; i <= n; n -= i, i *= 2) {            for (int j = Sum; j >= i * w; j--)                if (vis[j - i * w]) vis[j] = true;        }    }}int main() {    int cas = 1;    while (1) {        Sum = 0;        for (int i = 0; i < 6; i++) {            scanf("%d", &num[i]);            Sum += num[i] * (i + 1);        }        if (!Sum) break;        printf("Collection #%d:\n", cas++);        if (Sum % 2)            printf("Can't be divided.\n\n");        else {            Sum /= 2;            memset(vis, 0, sizeof(vis));            vis[0] = true;            for (int i = 0; i < 6; i++)                 if (num[i]) bag(i + 1, num[i]);            if (vis[Sum]) printf("Can be divided.\n\n");            else printf("Can't be divided.\n\n");        }    }    return 0;}
0 0
原创粉丝点击