这道题,只需要注意在刚开始的时候,dp[i]=MAX,dp[0]=0。因为要刚好与之对应,要取最大值。
#include <iostream>
using namespace std;
#define MAX 10000000
long min(long a,long b)
{
return a>b?b:a;
}
int main()
{
int t;
long e,f,n;
long dp[10005],w[505],p[505];
scanf("%d",&t);
while(t--)
{
scanf("%ld %ld %ld",&e,&f,&n);
for(int i=0;i<n;i++)
scanf("%ld %ld",&p[i],&w[i]);
for(int i=1;i<=(f-e);i++)
dp[i]=MAX;
dp[0]=0;
for(int i=0;i<n;i++)
for(int j=w[i];j<=(f-e);j++)
dp[j]=min(dp[j],dp[j-w[i]]+p[i]);
if(dp[f-e]<MAX)
printf("The minimum amount of money in the piggy-bank is %ld.\n",dp[f-e]);
else printf("This is impossible.\n");
}
return 0;
}