状态转移方程:
if( dp[j-coin[i].w] != MAX && dp[j] > dp[j-coin[i].w] + coin[i].c )
dp[j] = dp[j-coin[i].w] + coin[i].c;
#include<iostream>
using namespace std;
#define MAX 0X7ffffff
struct node{
int w;
int c;
};
node coin[505];
int dp[10005];
int main()
{
int t, e, f, n;
int i, j;
scanf( "%d", &t );
while( t-- ){
scanf( "%d %d", &e, &f );
f -= e;
scanf( "%d", &n );
for( i = 0; i < n; i++ )
scanf( "%d %d", &coin[i].c, &coin[i].w );
for( dp[0] = 0, i = 1; i <= f; i++ )
dp[i] = MAX;
for( i = 0; i < n; i++ )
for( j = coin[i].w; j <= f; j++ )
if( dp[j-coin[i].w] != MAX && dp[j] > dp[j-coin[i].w] + coin[i].c )
dp[j] = dp[j-coin[i].w] + coin[i].c;
if( dp[f] == MAX )
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[f]);
}
return 0;
}