思路:完全背包。补充在注释中。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int f[10010] = { 0 };
int main()
{
int E, F, m, N, T, p[1000], w[1000];
cin >> T;
while (T--)
{
scanf_s("%d%d%d", &E, &F, &N);
m = F-E;
for (int i = 0; i < N; i++)
{
cin >> p[i] >> w[i];
}
for (int i = 1; i <= m; i++)
{
f[i] = 10000000;
}
for(int i=0;i<N;i++)
for (int j = w[i]; j <= m; j++)
{
f[j] = min(f[j], f[j - w[i]] + p[i]);//此处是在剩余空间[j - w[i]]中进行空间安排,后面则是背包所对应的价值。
}
if (f[m] != 10000000)
printf("The minimum amount of money in the piggy-bank is %d.\n", f[m]);
else
cout << "This is impossible." << endl;
}
}