额似乎一直忘记了解释题意和梳理思路。。我就说怎么那么奇怪。。
这道题其实就是问,给你几种面值的钱,每种无限取,求达到重量时的最小总金额值。
完全背包裸题。
注意正着循环。还有当dp[amount]=INF(初始值)的时候代表无法达到该重量
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<vector>
#define INF 100000000
#define MAXNUM 25555555
#define pi 3.1415926
using namespace std;
int weight[MAXNUM];
int p[MAXNUM];
int dp[MAXNUM];
int main()
{
int T,n,E,F;
scanf("%d",&T);
while(T--){
scanf("%d%d",&E,&F);
int amount=F-E;
for(int i=1;i<=amount;i++){
dp[i]=INF;
}
// int temp=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&p[i],&weight[i]);
}
// if(temp<amount)printf("This is impossible.\n");
// else{
for(int i=0;i<n;i++){
for(int j=weight[i];j<=amount;j++){
dp[j]=min(dp[j-weight[i]]+p[i],dp[j]);
}
}
if(dp[amount]==INF) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[amount]);
// }
}
return 0;
}