完全背包的基础上变化了一点点
把这几题补完了,昨晚在宿舍打题时,有点懵
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 507, maxW = 1e4 + 7; //最多507种货币
int v[maxn], w[maxn];
int dp[maxW], n, c; //存钱罐净重c
void CompletePack(int V[], int W[], int n) {
for (int i = 0; i < n; ++i) {
for (int j = W[i]; j <= c; ++j) {
dp[j] = min(dp[j], dp[j - W[i]] + V[i]);
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--) {
int c0;
scanf("%d%d", &c0, &c);
c -= c0;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d%d", v + i, w + i);
}
memset(dp, 0x3f, sizeof dp); //dp[j]表示净重量为j的存罐所装钱币的最小值
dp[0] = 0;
CompletePack(v, w, n); //尴尬,开始忘了调用函数
if(dp[c] == 0x3f3f3f3f) {
puts("This is impossible.");
}
else {
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[c]);
}
}
return 0;
}