HDU 1114 Piggy-Bank (poj1384)

储钱罐

【题目描述】

今年的ACM比赛在xxx国举行,为了比赛的顺利进行,必须提前预算好需要的费用,以及费用的来源。费用的主要来源是只进不出的金钱。其实原理很简单,每当ACM成员有任何一点小钱,他们就会把这些钱全部投进储钱罐。你知道钱投进储钱罐后是无法再取出来的,除非你打碎储钱罐,而这是不允许的。经过一段足够长时间的积累,储钱罐中应该有足够的金钱来支付ACM比赛需要的一切费用。

储钱罐不允许打碎,我们也不能确定里面有多少钱,钱是否够用。不过,我们知道储钱罐以及每种硬币的重量,于是我们可以试着猜测里面有多少钱。为了保险起见,在已知重量的前提下,我们需要算出储钱罐中最少有多少钱(每种硬币可以使用多次,)。你能帮忙预算一下吗?

【输入】

第一行,两个正整数E和F,分别为空储钱罐的重量和装满硬币的储钱罐的重量(重量的单位是克,并且不会超过10公斤,即:1 <= E <= F <= 10000)。

第二行,有一个正整数n(1 <= N <= 500),为硬币的种类。

后面紧跟n行,每行为一种硬币类型,包含两个正整数p和w ,p为硬币的价值,w为硬币的重量,单位为克。(1 < = P < = 50000,1 < = W < = 10000)。

【输出】

输出只有一行,如果能求出符合要求的储蓄罐的最低金额,则输出该金额,否则输出“This is impossible.”。

【输入样例1】

10 110

2

1 1

30 50

【输出样例1】

60

【输入样例2】

10 110

2

1 1

50 30

【输出样例2】

100

【输入样例3】

1 6

2

10 3

20 4

【输出样例3】

This is impossible.

一句话题意:恰好装满容量为ff-e的背包,需要的最少硬币金额是多少?

分析:完全背包问题+恰好装满+最小值

f[i,j]:=min{f[i-1,j-K*w[i]]+K*p[i]}(k>=0)=min{f[i-1,j],f[i-1,j-K*w[i]]+K*p[i]}(k>=1)

f[i-1,j-K*w[i]]+K*p[i](K>=1)

=min{f[i-1,j], f[i-1,(j-w[i])-k*w[i]]+k*p[i]+p[i](K>=0)}

=min{ f[i-1,j], f[i,(j-w[i])+p[i]}

初始值(在没有任何物品可以放入背包时的合法状态):

f[0]=0;       //容量为0的背包可能被价值为0的nothing“恰好装满”

f[1~n]=+∞  //其它容量的背包均没有合法的解,属于未定义的状态,本题又是求最小值,则初始值就应该是∞了。

 1 const
 2   maxm=20000;
 3   maxnum=30000000;
 4 var
 5   e,ff,n,m,t,i:longint;
 6   p,w:array[0..600] of longint;
 7   f:array[0..20000]of longint;
 8   procedure init;
 9   var i:longint;
10   begin
11  //   assign(input,‘pig.in‘);reset(input);
12
13     readln(e,ff);
14     m:=ff-e;
15     readln(n);
16     for i:=1 to n do readln(p[i],w[i]);
17    // close(input);
18   end;
19   procedure wqdp;
20   var i,j:longint;
21   begin
22     f[0]:=0;
23     for i:=1 to maxm do f[i]:=maxnum;
24     for i:=1 to n do
25       for j:=1 to m do
26         if (j>=w[i]) and(f[j]>f[j-w[i]]+p[i])  then
27           f[j]:=f[j-w[i]]+p[i];
28   end;
29   procedure print;
30   begin
31     if f[m]=maxnum then writeln(‘This is impossible.‘)
32     else writeln(‘The minimum amount of money in the piggy-bank is ‘,f[m],‘.‘);
33   end;
34 begin
35  // readln(t);
36  // for i:=1 to t do
37  // begin
38   init;
39   wqdp;
40   print;
41  // end;
42 end.

时间: 2024-10-08 18:27:54

HDU 1114 Piggy-Bank (poj1384)的相关文章

[2016-03-27][HDU][1114][Piggy-Bank]

时间:2016-03-27 16:37:56 星期日 题目编号:[2016-03-27][HDU][1114][Piggy-Bank] 遇到的问题:注意f == e的情况,即dp[0] = 0; #include <cstring> #include <cstdio> #include<algorithm> using namespace std; int dp[10000 + 10]; int w[500 + 10],c[500 + 10]; int main(){

hdu 1114 Piggy-Bank

题目: 链接:点击打开链接 题意: 知道存钱罐的质量和装满硬币的存钱罐的质量,然后是不同硬币的价值和质量,求出存钱罐里钱币的最小价值. 算法: 完全背包问题,银币的个数是不限的. 思路: 状态转移方程:j = 0时,价值为0 dp[j] = min(dp[j],dp[j-w[i]]+v[i]);//表示质量为j的钱币,含有的最小的价值 代码: #include<iostream> #include<cstdio> #include<cstring> using name

hdu 1114 完全背包问题

题意:给定背包体积与物品的体积与价值 求正好放完的最小价值#include<iostream> using namespace std; int min(int a,int b) { if(a<b) return a; return b; } int main() { int t,m1,m2,n,i,j; int v[502],w[502],dp[10005],m; cin>>t; while(t--) { cin>>m1>>m2; m=m2-m1;

HDU 1114 Piggy-Bank(一维背包)

题目地址:HDU 1114 把dp[0]初始化为0,其它的初始化为INF.这样就能保证最后的结果一定是满的,即一定是从0慢慢的加上来的. 代码例如以下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #incl

hdu 1114 Piggy-Bank dp

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define inf 10000000 int dp[11000]; int n; int val[550],wei[550]; int main() { int cas,n; scanf("%d",&cas); while(cas--) { int w1,w2,w; int i,j;

HDU 1114 Piggy-Bank(完全背包 DP)

题意  知道空存钱罐的重量和装满钱的存钱罐的重量及每种币值的重量   求存钱罐里至少有多少钱 裸的完全背包  但是是求最小值  所以初始0要变成初始INF  max也要变成min #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 10005, INF = 0x3f3f3f3f; int val[N], wei[N], d[N]; int ma

F - Piggy-Bank HDU 1114 (完全背包的变形+初始化细节)

F - Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1114 Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for th

C - Piggy-Bank HDU - 1114

C - Piggy-Bank HDU - 1114 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 memb

HDU 1114 (dp 完全背包)

鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 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 i