HDU1114--Piggy-Bank(完全背包变形)

Piggy-Bank

 
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 557 Accepted Submission(s): 304

Problem Description

Before ACM can do anything, a budget must be prepared and the
necessary financial support obtained. The main income for this action
comes from Irreversibly Bound Money (IBM). The idea behind is simple.
Whenever some ACM member has any small money, he takes all the coins and
throws them into a piggy-bank. You know that this process is
irreversible, the coins cannot be removed without breaking the pig.
After a sufficiently long time, there should be enough cash in the
piggy-bank to pay everything that needs to be paid.

But there is
a big problem with piggy-banks. It is not possible to determine how
much money is inside. So we might break the pig into pieces only to find
out that there is not enough money. Clearly, we want to avoid this
unpleasant situation. The only possibility is to weigh the piggy-bank
and try to guess how many coins are inside. Assume that we are able to
determine the weight of the pig exactly and that we know the weights of
all coins of a given currency. Then there is some minimum amount of
money in the piggy-bank that we can guarantee. Your task is to find out
this worst case and determine the minimum amount of cash inside the
piggy-bank. We need your help. No more prematurely broken pigs!


Input

The input consists of T test cases. The number of them (T) is
given on the first line of the input file. Each test case begins with a
line containing two integers E and F. They indicate the weight of an
empty pig and of the pig filled with coins. Both weights are given in
grams. No pig will weigh more than 10 kg, that means 1 <= E <= F
<= 10000. On the second line of each test case, there is an integer
number N (1 <= N <= 500) that gives the number of various coins
used in the given currency. Following this are exactly N lines, each
specifying one coin type. These lines contain two integers each, Pand W
(1 <= P <= 50000, 1 <= W <=10000). P is the value of the
coin in monetary units, W is it‘s weight in grams.


Output

Print exactly one line of output for each test case. The line
must contain the sentence "The minimum amount of money in the piggy-bank
is X." where X is the minimum amount of money that can be achieved
using coins with the given total weight. If the weight cannot be reached
exactly, print a line "This is impossible.".


Sample Input

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

Sample Output

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.
 

Source

Central Europe 1999


Recommend

Eddy

题目大意:

多种硬币放入一个存钱罐中(不限数目), 每种硬币 i 有价值 Vi 与重量  Wi 两个属性, 求给定重量 y-x 下最小的硬币钱数n

解题思路:

这是一个多重背包的变形[每种硬币最多有 (y-x)/Wi 个]. 但这道题目求的是在完全装满背包的前提下最小的价值.

自然想到的是将经典的背包问题的状态转移方程进行修改, 将max改为min, 但这样处理的话, 初始化的时候需要动一下脑筋

考虑正常的背包问题, 若要求的是恰好装满的状态是, 需要将除 dp[0] 之外的其他元素全部初始化为 负无穷, 最后的结果若为负无穷,说明无解(负无穷+有限数仍为负无穷, 这样就排除掉了不恰好装满的状态) .

但这道题目要求的是最小值, 所以我们需要将需 dp[0] 之外的其他元素全部初始化为 正无穷 , dp[0]初始化为0

如此即可AC

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define INF 0x7ffffff
#define MAXN 10000
using namespace std;
int dp[10010];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
    #endif
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;
    int cc;
    int e,f;
    int n;
    cin>>t;
    int p,w;
    while(t--){
        cin>>e>>f;
        cc=f-e;
        cin>>n;
        dp[0]=0;
        for(int i=1;i<=cc;i++){
            dp[i]=INF;
        }
        for(int i=0;i<n;i++){
            cin>>p>>w;
            for(int j=w;j<=cc;j++){
                dp[j]=min(dp[j],dp[j-w]+p);
            }
        }
        if(dp[cc]==INF){
            cout<<"This is impossible."<<endl;
        }
        else cout<<"The minimum amount of money in the piggy-bank is "<<dp[cc]<<"."<<endl;
    }
}
时间: 2024-07-28 20:22:58

HDU1114--Piggy-Bank(完全背包变形)的相关文章

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

codeforce Gym 101102A Coins (01背包变形)

01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXW 15005 #define N 155 #define LL long long #define MOD 1000000007 int w1[N],w2[N]; LL dp1[MAXW],dp2[MAXW]; int main(

hdu 4381(背包变形)

题意: 给定n个块,编号从1到n,以及m个操作,初始时n个块是白色. 操作有2种形式: 1 ai xi : 从[1,ai]选xi个块,将这些块涂白. 2 ai xi:从[ai,n]选xi个块,将这些块涂白. 可以忽略某些操作且如果区间内没有足够的黑块(黑块用于涂白),则不能进行这个操作. 分析: 写写画画一看就知道这道题是一个背包问题. “恰好装满背包”. 以下摘自题解: 本题难点在于正确处理两种操作,不妨假设只有一种操作,那么这种操作如果是1的话那么就把操作按照a从小到大排序,每次都尽量往最左

Wikioi 1025 01背包变形

这题多加了菜品必选编号,所以刚开始不知道怎么写,原来就把必选的处理下就行了,因为有重复,但是相同的价值与价格都一样,所以这里就直接挑出来就行了. 把不是必选的在里面用dp即可,dp之前也要把重复的舍去. 因为总价格容量为浮点数,所以先乘以10变成整数就可以用01背包了. #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque&

codeforces 742D Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses ——(01背包变形)

题意:给你若干个集合,每个集合内的物品要么选任意一个,要么所有都选,求最后在背包能容纳的范围下最大的价值. 分析:对于每个并查集,从上到下滚动维护即可,其实就是一个01背包= =. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <vector> 5 using namespace std; 6 const int N = 1000 + 5;

POJ 3093 Margaritas on the River Walk (0-1背包变形)

这题目的思路很巧妙,什么情况下剩下的所有物品都放不下呢?就是当前剩余物品中最小的那个也放不下.所以,先把物品按照容量从小到大排序,依次枚举当前背包为放不下的最小物品的情况. 对于当前物品i,必有1到i-1的所有物品都放进去,这时候比i大的物品谁放谁不放是不确定的.转换成0-1背包问题:把前i-1个物品都放进去以后,得到空间为tsum - sum[i-1](前缀和)的包,只要从第i+1到第n个物品中拿出一个方案填充这个包使得剩余体积小于第i个物品的体积就可以了,把总方案数累加就是结果! 注意特殊情

sdut 2934 人活着系列之平方数 (完全背包变形)

题目链接 分析:完全背包的变形,每一层的d[]数组代表这一层的这个数新加入以后所构成的val的种类. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 500+10; 8 using namespa

HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4739    Accepted Submission(s): 2470 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took pa

Piggy-Bank(完全背包变形)

Problem Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for this action comes from Irreversibly Bound Money (IBM). The idea behind is simple. Whenever some ACM member has