定义 f[j]为重量为j的时候的最小钱数,然后更新即可。。代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10000 + 100; const int inf = 0x3f3f3f3f; int E, F, N; struct Wu { int p, w; }wu[500 + 10]; int f[maxn]; //重量为j的时候的最小价钱 int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d%d", &E, &F, &N); for(int i=0; i<N; i++) scanf("%d%d", &wu[i].p, &wu[i].w); memset(f, 0x3f, sizeof(f)); int c = F-E; f[0] = 0; for(int i=0; i<N; i++) { for(int j=wu[i].w; j<=c; j++) { if(f[j]>f[j-wu[i].w]+wu[i].p && f[j-wu[i].w]!=inf) f[j] = f[j-wu[i].w] + wu[i].p; } } if(f[c] == inf) printf("This is impossible. "); else printf("The minimum amount of money in the piggy-bank is %d. ", f[c]); } return 0; }