完全背包问题
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char** argv) {
int dp[10005];
int n, m, w[505], v[505], ew, fw;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> ew >> fw;
int bag = fw - ew;//要装的空间大小
int num;//硬币种类
cin >> num;
for(int i = 1; i <= num; i++) {
cin >> v[i] >> w[i];
}
for(int i = 1; i <= bag; i++) dp[i] = 0x7fffffff;
dp[0] = 0;
for(int i = 1; i <= num; i++) {
for(int j = w[i]; j <= bag; j++) {
if(dp[j - w[i]] != 0x7fffffff)//要注意要不为无穷才可以
dp[j] = min(dp[j], dp[j - w[i]] + v[i]);
}
for(int j = 1; j <= bag; j++) cout << dp[j] << " ";
cout << endl;
}
if(dp[bag] != 0x7fffffff) {
cout << "The minimum amount of money in the piggy-bank is " << dp[bag] << "." << endl;
} else {
cout << "This is impossible." << endl;
}
}
return 0;
}