• POJ-1384-Piggy Bank


    链接: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.
    ");
            else
                printf("The minimum amount of money in the piggy-bank is %d.
    ", dp[f - e]);
        }
    
    
        return 0;
    }
    

      

  • 相关阅读:
    5.5,5.6
    5.1,5.2
    第四章.编程练习
    多源最短路径--flody算法
    Java 面试题
    python 打包exe程序
    sql优化
    二叉树
    todo: 队列、栈、散列集
    java注解
  • 原文地址:https://www.cnblogs.com/YDDDD/p/10465956.html
Copyright © 2020-2023  润新知