题目链接:点击这里
有 种不同面值的硬币,每种面值的硬币还有相应的数量限制,多重背包问题。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 15, M = 20010;
int a[N], b[N]; // 面值和数量
int f[M];
int main()
{
int n, m;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]);
scanf("%d", &m);
memset(f, 0x3f, sizeof f);
f[0] = 0;
for (int i = 0; i < n; i++) // 枚举物品
{
for (int j = m; j >= a[i]; j--) // 再逆序枚举体积
{
for (int k = 0; k <= b[i] && k * a[i] <= j; k++) // 再枚举决策
{
f[j] = min(f[j], f[j - k * a[i]] + k);
}
}
}
printf("%d\n", f[m] == INF ? -1 : f[m]);
return 0;
}