HDU - 1114 Piggy-Bank 背包问题求最小值

题目链接: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]);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值