POJ-1384-Piggy Bank

本文探讨了使用完全背包算法解决ACM财务管理问题的方法。通过称重存钱罐并利用已知硬币重量,确定存钱罐内的最低现金数量,避免在没有足够资金时破坏存钱罐。

链接: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;
}

  

转载于:https://www.cnblogs.com/YDDDD/p/10465956.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值