这是完全背包问题求最小值,其状态转移方程为:
dp[ j ] = min(dp[ j ], dp[ j - w[ i ] ] + v[ i ])
#include <iostream>
#include <cstdio>
#include <climits>
using namespace std;
const int N = 1e4 + 10;
int main(){
int t, e, f, n, v[N], w[N], dp[N];
scanf("%d", &t);
while(t--){
scanf("%d%d%d", &e, &f, &n);
for(int i = 0; i < n; i++) scanf("%d%d", &v[i], &w[i]);
int m = f - e; //硬币的重量
fill(dp, dp + m + 1, INT_MAX / 10);
dp[0] = 0;
for(int i = 0; i < n; i++){
for(int j = w[i]; j <= m; j++){
dp[j] = min(dp[j], dp[j - w[i]] + v[i]);
}
}
if(dp[m] == INT_MAX / 10) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n", dp[m]);
}
return 0;
}