链接:https://vjudge.net/problem/POJ-1384
题意:
在ACM可以做任何事情之前,必须准备预算并获得必要的财务支持。此行动的主要收入来自不可逆转的捆绑资金(IBM)。背后的想法很简单。每当一些ACM成员有任何小钱时,他拿走所有硬币并将它们扔进存钱罐。你知道这个过程是不可逆转的,硬币不能在不打破猪的情况下被移除。经过足够长的时间,存钱罐里应该有足够的现金来支付需要支付的所有东西。
但是存钱罐存在很大问题。无法确定内部有多少钱。因此,我们可能会将猪分成碎片,但却发现没有足够的钱。显然,我们希望避免这种不愉快的情况。唯一的可能性是称重存钱罐并试图猜测里面有多少硬币。假设我们能够确切地确定猪的重量并且我们知道给定货币的所有硬币的重量。然后,我们可以保证在存钱罐中有一些最低金额。你的任务是找出最坏的情况,并确定存钱罐内的最低现金数量。我们需要你的帮助。不再过早破猪!
思路:
完全背包,同时保证背包刚好装满。
dp数组初始化INF。
完全背包即可。
代码:
#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e4 + 10;
const int INF = 1e9;
int dp[MAXN];
int p[MAXN];
int w[MAXN];
int main()
{
int t;
int e, f;
int n;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &e, &f);
for (int i = 1;i <= f - e;i++)
dp[i] = INF;
dp[0] = 0;
scanf("%d", &n);
for (int i = 1;i <= n;i++)
scanf("%d%d", &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] == INF)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[f - e]);
}
return 0;
}