HDU 1114 Piggy-Bank

题意

小猪储钱罐存在一个大的问题,即无法确定其中有多少钱。
因此,我们可能在打碎小猪储钱罐之后,发现里面的钱不够。
显然,我们希望避免这种不愉快的情况。
唯一的可能是,称一下小猪储钱罐的重量,并尝试猜测里面的有多少硬币。
假定我们能够精确判断小猪储钱罐的重量,并且我们也知道给定币种的所有硬币的重量。
那么,我们可以保证小猪储钱罐中最少有多少钱。
你的任务是找出最差的情形,即判断小猪储钱罐中的硬币最少有多少钱。我们需要你的帮助。不能再贸然打碎小猪储钱罐了!

题解

    [线性DP--背包模型]
通过分析:
    可以得到是一个完全背包的模型,且为必须装满的情况,
    所以只需要注意一下初始化就行:
        dp[0][0] = 0
        dp[][] = INF (空集只是(0 ,0)的可行解,且求的是最小值)

Code

#include<bits/stdc++.h>
#define read(a) scanf("%d", &a)
#define mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
using namespace std;
const int INF = 1e9 + 7;
const int N = 2e5 + 7;
const int M = 1e6 + 7;
int dp[M];
signed main()
{
    int T; read(T);
    while(T--)
    {
        int t1, t2; read(t1); read(t2);
        int m = t2 - t1;
        int n; read(n);
        for(int i = 1; i <= m; i++) dp[i] = INF;
        dp[0] = 0;
        for(int i = 1, vi, wi; i <= n; i++)
        {
            read(vi); read(wi);
            for(int j = wi; j <= m; j++)
                dp[j] = min(dp[j], dp[j-wi] + vi);
        }
        if(dp[m] >= INF) puts("This is impossible.");
        else       printf("The minimum amount of money in the piggy-bank is %d.\n", dp[m]);
    }
    return 0;
}
**/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值