大意:
储钱罐的空重量E,和装钱后重量F。
给出N种硬币。 N种硬币的重量W和面值P。
就是求 容量为total = F - E的背包。装满后最小的钱数量。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int T, N, E, F, p[505], w[505], opt[10005];
int main ( ) {
scanf ( "%d", &T );
while ( T-- ) {
scanf ( "%d%d%d", &E, &F, &N );
int total = F - E;
for ( int i = 1; i <= N; ++i )
scanf ( "%d%d", &p[i], &w[i] );
for ( int i = 1; i <= total; ++i ) opt[i] = -2000000000;
opt[0] = 0;
for ( int i = 1; i <= N; ++i )
for ( int j = w[i]; j <= total; ++j ) {
if ( opt[j] < 0 ) opt[j] = opt[j - w[i]] + p[i];
else {
if ( opt[j - w[i]] + p[i] > 0 ) opt[j] = min ( opt[j], opt[j - w[i]] + p[i] );
}
}
if ( opt[total] <= 0 ) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",opt[total]);
}
}