题目链接: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;
}