题目
反向多重背包 ,当背包恰好装满时,求最小价值
#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
#include <queue>
#include <map>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int T, E, F, N;
int val[510], wei[510], dp[10010];
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> T;
while (T--) {
cin >> E >> F >> N;
int V = F - E;
for (int i = 1; i <= N; i++) {
cin >> val[i] >> wei[i];
}
memset(dp, 127, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= N; i++) {
for (int j = wei[i]; j <= V; j++) {
dp[j] = min(dp[j], dp[j - wei[i]] + val[i]);
}
}
if (dp[V] <= 25000000) {
cout << "The minimum amount of money in the piggy-bank is " << dp[V] << ".\n";
}
else {
cout << "This is impossible.\n";
}
}
return 0;
}