题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
注意事项 :
1注意v以及w的体现
2当求无穷小时 需要将dp【0】初始化为0其他值通过循环赋值为INF
3注意如何将值定义为无穷大
题解参考:https://www.cnblogs.com/rain-1/p/4758705.html
如何求完全背包中的最值:
https://www.cnblogs.com/bestcoder-Yurnero/p/10688562.html
关于完全背包加最值问题:https://blog.csdn.net/exchan/article/details/76735967
以下为题意:
在ACM可以做任何事情之前,必须编制预算并获得必要的财政支持。这一行动的主要收入来自不可逆绑定货币(IBM)。背后的想法很简单。每当某个ACM成员有一点钱时,他就把所有的硬币都扔到储蓄罐里。你知道这个过程是不可逆的,硬币不打碎猪是不可能取出来的。在足够长的一段时间后,银行里应该有足够的现金来支付所有需要支付的费用。
但是小猪银行有一个大问题。不可能确定里面有多少钱。所以我们可能会把猪撕成碎片,结果发现没有足够的钱。显然,我们想要避免这种不愉快的情况。唯一的办法是称一下猪圈的重量,试着猜出里面有多少枚硬币。假设我们能够准确地确定猪的重量,并且我们知道给定货币的所有硬币的重量。然后,我们可以保证银行里有一定数量的钱。你的任务是找出这个最坏的情况,并确定银行里的最低现金数额。我们需要你的帮助。再也不会过早地摔坏猪了!
输入
输入由T测试用例组成。它们的数量(T)在输入文件的第一行给出。每个测试用例都以一行包含两个整数E和f开始,它们表示一只空猪和一只装满硬币的猪的重量。两个重量单位都是克。每头猪的体重不会超过10公斤,也就是说1 <= E <= F <= 10000。在每个测试用例的第二行,有一个整数N (1 <= N <= 500),它给出了给定货币中使用的各种硬币的数量。下面正好有N行,每一行指定一种硬币类型。这些行包含两个整数,Pand W (1 <= P <= 50000, 1 <= W <=10000)。P是硬币的价值的货币单位,W是它的重量的克数。
输出
为每个测试用例打印一行输出。这一行必须包含“piggy-bank中钱的最小数量是X”这句话,其中X是使用给定总重量的硬币可以获得的钱的最小数量。如果重量不能准确达到,打印一行“这是不可能的。”
样例输入
3.
110
2
1
30 50
110
2
1
50 30
1 - 6
2
10 3
20 4
样例输出
银行里的最低存款额是60英镑。
银行的最低存款额是100英镑。
这是不可能的。
Code:
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f //通过宏替换定义无穷大
const int N = 100000;
int dp[N];
int w[N],v[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int E,F;
scanf("%d%d",&E,&F);
int spci;
scanf("%d",&spci);
for(int i = 1;i <= spci;i ++) scanf("%d%d",&v[i],&w[i]);
for(int i = 0;i <= F-E; i++) dp[i] = INF;
dp[0] = 0;
for(int i = 1;i <= spci;i ++)
for(int j = w[i];j <= F-E;j ++)
{
dp[j] = min(dp[j],dp[j-w[i]] + v[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]);
}
}