POJ1742 Coins 【多重背包】

题目链接:http://poj.org/problem?id=1742

题意:
一个人有 n 种硬币,每种硬币价值(Ai)不同,每种硬币都有一个数量(Ci),问能凑出多少个 m 以内的币值?

题解:
多重背包直接网上套

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int dp[100005];
int n, m;
int a[105], b[105], sum[100005];

int main() {
    while( scanf("%d %d", &n, &m), n+m ) {
        for ( int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
        for ( int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);

        memset(dp, 0, sizeof(dp));
        dp[0] = 1;

        int ans = 0;
        for ( int i = 1; i <= n; i ++ ) {
            memset(sum, 0, sizeof(sum));
            for ( int j = a[i]; j <= m; j ++ ) {
                if(!dp[j] && dp[j-a[i]] && sum[j-a[i]] < b[i]) {
                    dp[j] = 1;
                    sum[j] = sum[j-a[i]]+1;
                    ans ++;
                }
            }
        } 
        printf("%d\n", ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34896694/article/details/66474127