最后输出This is impossible.的地方有问题……求调。
存钱罐有个大问题,不打碎存钱罐,就无法确定里面有多少钱,所以可能会出现把存钱罐打碎后发现钱不够的情况。唯一的可能是,称一下存钱罐的重量,试着猜里面有多少钱。已知存钱罐的重量和每种面值的硬币重量,请确定存钱罐内的最小金额。
输入的第1行包含整数 T ,表示测试用例的数量。每个测试用例的第1行都包含两个整数 e 和 f (1≤e≤f≤10000),分别表示空存钱罐和装满硬币存钱罐的重量(以克计)。第2行包含一个整数n(1≤n≤500),表示硬币的总数量。接下来的 n 行,每行都包含两个整数 p 和 w ( 1≤p≤50000 , 1≤w≤10000 ),分别表示硬币的面值和重量。
对每个测试样例,都输出一行,包含The minimum amount of money in the piggy-bank is x.,其中 x 是存钱罐内的最小金额。若无法确定,则输出This is impossible.。
3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4
The minimum amount of money in the piggy-bank is 60.
The minimum amount of money in the piggy-bank is 100.
This is impossible.
#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t, e, f, n, p[505] = {}, w[505] = {}, dp[10005] = {};
cin >> t;
while (t--)
{
memset(p, 0, sizeof(p));
memset(w, 0, sizeof(w));
dp[0] = 0;
for (int i = 1; i < 10005; i++)
dp[i] = INT_MAX;
cin >> e >> f >> n;
for (int i = 1; i <= n; i++)
cin >> p[i] >> w[i];
for (int i = 1; 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] < INT_MAX)
cout << "The minimum amount of money in the piggy-bank is " << dp[f - e] << "." << "\n";
else
cout << "This is impossible." << "\n";
}
return 0;
}