您的位置:首页 > 其它

HDU - 2844 Coins(多重背包)

2015-09-24 21:18 399 查看
题目大意:给出N中硬币的价值和数量,问[1-m]有几个数能用硬币组成

解题思路:多重背包裸题

[code]#include <cstdio>
#include <cstring>
const int M = 100010;
const int N = 110;

bool vis[M];
int val
, num
;
int n, m;

void ZeroOnePack(int w) {
    for (int i = m; i >= w; i--)
        if (vis[i - w]) vis[i] = true;
}

void CompletePack(int w) {
    for (int i = w; i <= m; i++)
        if (vis[i - w]) vis[i] = true;
}

void solve() {
    memset(vis, 0, sizeof(vis));
    vis[0] = true;
    for (int i = 0; i < n; i++) {
        if (num[i] * val[i] >= m) 
            CompletePack(val[i]);
        else {
            int t = 1;
            while (t <= num[i]) {
                ZeroOnePack(val[i] * t);
                num[i] -= t;
                t *= 2;
            }
            ZeroOnePack(val[i] * num[i]);
        }
    }
    int ans = 0;

    for (int i = 1; i <= m; i++)
        if (vis[i]) ans++;
    printf("%d\n", ans);
}

void init() {
    for (int i = 0; i < n; i++)
        scanf("%d", &val[i]);
    for (int i = 0; i < n; i++)
        scanf("%d", &num[i]);
}

int main() {
    while (scanf("%d%d", &n, &m) != EOF && n + m) {
        init();
        solve();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: