题目大意:存钱罐重t1克,加上钱币以后t2克。有m种硬币,输入每种硬币的价值以及硬币的重量,求存钱罐最少有多少钱。
解题思路:完全背包,且要正好装满,初始化为无穷大,除了dp[0],dp大小为体积最大的情况。
ac代码:
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n, m, t1, t2, V, value[505], weight[505], dp[10005];
int main()
{
scanf("%d", &n);
while (n--){
scanf("%d%d%d", &t1, &t2, &m);
V = t2 - t1;
for (int i=0; i<m; i++)
scanf("%d%d", &value[i], &weight[i]);
for (int i=0; i<=V; i++)
dp[i] = INF;
dp[0] = 0;
for (int i=0; i<m; i++)
for (int j=weight[i]; j<=V; j++)
dp[j] = min(dp[j], dp[j-weight[i]]+value[i]);
if (dp[V] < INF)
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[V]);
else
printf("This is impossible.\n");
}
return 0;
}