基本的动态规划题。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 500000000; //硬币最大总价值
int dp[10005], v[505], w[505]; //动态规划数组,硬币价值数组,硬币重量数组
int main()
{
int T;
cin >> T;
while (T--)
{
int m, n, k; //空罐重量,满罐重量,硬币种类
cin >> m >> n >> k;
for (int i = 0; i < k; i++)
{
cin >> v[i] >> w[i];
}
int sumW = n - m; //硬币总重量
fill(dp, dp + sumW + 1, inf); //填充dp数组
dp[0] = 0; //初始化dp数组的第一个元素,总重量为0对应的最小价值为0
for (int i = 0; i < k; i++) //动态规划
{
for (int j = w[i]; j <= sumW; j++)
dp[j] = min(dp[j - w[i]] + v[i], dp[j]);
}
if (dp[sumW] == inf)
cout << "This is impossible." << endl;
else
cout << "The minimum amount of money in the piggy-bank is " << dp[sumW] << '.' << endl;
}
return 0;
}
继续加油。