zoukankan      html  css  js  c++  java
  • 背板问题之满包问题

    在 ACM 能够开展之前,必须准备预算,并获得必要的财力支持。该活动的主要收入来自于 Irreversibly Bound Money (IBM)。思路很简单。任何时候,某位 ACM 会员有少量的钱时,他将所有的硬币投入到小猪储钱罐中。这个过程不可逆,因为只有把小猪储钱罐打碎才能取出硬币。在足够长的时间之后,小猪储钱罐中有了足够的现金,用于支付 ACM 活动所需的花费。

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

    你的任务是找出最差的情形,即判断小猪储钱罐中的硬币最少有多少钱。我们需要你的帮助。不能再贸然打碎小猪储钱罐了!

    输入

    输入包含 T 组测试数据。输入文件的第一行,给出了 T 的值。

    对于每组测试数据,第一行包含 E 和 F 两个整数,它们表示空的小猪储钱罐的重量,以及装有硬币的小猪储钱罐的重量。两个重量的计量单位都是 g (克)。小猪储钱罐的重量不会超过 10 kg (千克),即 1 <= E <= F <= 10000 。每组测试数据的第二行,有一个整数 N (1 <= N <= 500),提供了给定币种的不同硬币有多少种。接下来的 N 行,每行指定一种硬币类型,每行包含两个整数 P 和 W (1 <= P <= 50000,1 <= W <=10000)。P 是硬币的金额 (货币计量单位);W 是它的重量,以 g (克) 为计量单位。

    输出

    对于每组测试数据,打印一行输出。每行必须包含句子 “The minimum amount of money in the piggy-bank is X.” 其中,X 表示对于给定总重量的硬币,所能得到的最少金额。如果无法恰好得到给定的重量,则打印一行 “This is impossible.” 。

    示例输入

    3
    10 110
    2
    1 1
    30 50
    10 110
    2
    1 1
    50 30
    1 6
    2
    10 3
    20 4

    示例输出

    The minimum amount of money in the piggy-bank is 60.
    The minimum amount of money in the piggy-bank is 100.
    This is impossible.

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define INF 100000000
    using namespace std;
    const int N=1E5;
    int dp[N];
    int w[N];
    int price[N];
    int main(){
        
        int t;
        cin>>t;
        while(t--){
            int n,m;
            cin>>n>>m;
            int nn=m-n;
            for(int i=0;i<=nn;i++){
                dp[i]=INF;
            }
            int mm;
            cin>>mm;
            for(int i=1;i<=mm;i++){
                cin>>price[i]>>w[i];
            }
            dp[0]=0;//这一步是特别重要的。
            for(int i=1;i<=n;i++){
                for(int j=w[i];j<=nn;j++){
                    dp[j]=min(dp[j],dp[j-w[i]]+price[i]);
                }
            }
            if(dp[nn]==INF) printf("This is impossible.
    ");
            else printf("The minimum amount of money in the piggy-bank is %d.
    ",dp[nn]);
            
        }
        
        return 0;
    }

    总结:

    背包问题的恰好装满问题:

    在一些背包问题中要求会从不超过背包最大容量变为恰好装满背包,与前者的差别在于初始化的不同

    1. 在恰好装满的情况下取最大值:

    把dp[maxn]全赋值为-INF
    dp[0]=0;
    如果dp[n]==-INF,则在容量为n时,背包无法装满。
    恰好装满的dp[n]有一个具体值,而不是-INF

    2.在恰好装满的情况下去最小值:

    把dp[maxn]全赋值为INF
    dp[0]=0;
    如果dp[n]==INF,则在容量为n时,背包无法装满。
    恰好装满的dp[n]有一个具体值,而不是INF.

    满包问题:http://www.360doc.com/content/20/0325/09/69169653_901520769.shtml

  • 相关阅读:
    gridview把textbox的值修改还是旧值的解决方法
    [转载]FMS Dev Guide学习笔记(验证客户端二)
    推荐几个Adobe Flex Builder 3的插件(代码格式化和fms服务器通讯文件(main.asc)编写)
    淘宝装修新旺铺如何让店招导航栏透明?
    淘宝店面怎么装修(不花分毫,玩转淘宝)
    教你处理明暗不匀的宝贝照片
    淘宝店铺装修 免费扶植版教程
    淘宝店铺(宝贝描述模板)克隆攻略
    如何用淘宝助理上传宝贝装修模板
    淘宝商城推广方案书
  • 原文地址:https://www.cnblogs.com/Accepting/p/11278384.html
Copyright © 2011-2022 走看看