hdu1114 Piggy-Bank (DP基础 完全背包)

链接:Piggy-Bank

大意:已知一只猪存钱罐空的时候的重量、现在的重量,已知若干种钱的重量和价值,猪里面装着若干钱若干份,求猪中的钱的价值最小值。

题解:

DP,完全背包。

g[j]表示组成重量j的最小花费

g[j]=min(g[j],g[j-w[i]]+v[i])

完全背包物品可以多次使用,所以j的循环要正着来。

代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<map>
 8 #include<set>
 9 using namespace std;
10 #define ll __int64
11 #define usint unsigned int
12 #define mz(array) memset(array, 0, sizeof(array))
13 #define minf(array) memset(array, inf, sizeof(array))
14 #define REP(i,n) for(int i=0;i<(n);i++)
15 #define FOR(i,x,n) for(int i=(x);i<=(n);i++)
16 #define RE  freopen("1.in","r",stdin)
17 #define WE  freopen("1.out","w",stdout)
18
19 const int maxn=555;
20 const int maxv=10001;
21 const int inf=0x3f3f3f3f;
22
23 int w[maxn],v[maxn];
24 int g[maxv];
25
26 int main() {
27     int i,j,k,ans,t;
28     int e,f,n;
29     scanf("%d",&t);
30     while(t--) {
31         scanf("%d%d%d",&e,&f,&n);
32         for(i=0; i<n; i++)
33             scanf("%d%d",&v[i],&w[i]);
34         minf(g);
35         g[0]=0;
36         REP(i,n)
37             FOR(j,w[i],maxv-1)
38                 g[j]=min(g[j],g[j-w[i]]+v[i]);
39         if(g[f-e]==inf) printf("This is impossible.\n");
40         else printf("The minimum amount of money in the piggy-bank is %d.\n",g[f-e]);
41     }
42     return 0;
43 }

hdu1114 Piggy-Bank (DP基础 完全背包)

时间: 2024-10-09 22:01:46

hdu1114 Piggy-Bank (DP基础 完全背包)的相关文章

DP基础

DP基础 简单dp 背包问题 记忆化搜索 简单dp 数字三角形 给一个数字构成的三角形,求从顶端走到底部的一条路径,使得路径上的和最大(或者最小). 1 2 3 6 5 4 Example_1 7 3 8 8 1 0 5 2 6 100000 Example_2 根据Example_2可以知道贪心显然是不正确的. 可以看出,除了两边的点以外,每个点可以上一层的两个位置之一到达当前点. 如果我们知道上一层的从顶端到达两个位置的最大路径值,那么对于当前点来说,必然选择较大的那个位置转移过来,也就得到

poj1276——dp,多重背包

poj1276——dp,多重背包 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28826   Accepted: 10310 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested c

poj 2063 基础完全背包

这是一题基础的完全背包,适合初学者来理解完全背包 题意:有 n 种债券可以买 ,  每种债券的价格为 w , 每一年的收益为 p , 给你 wi 块钱 , 和 years 年的时间 , 我们最大的收益是是多少? 因为 , 每种债券可以买任意多个 , 所以这是一个简单的完全背包,但是由于基数(体积)太大 , 所以需要优化一下 : 由题意我们知道 , 每种债券的价格都是 1000 的倍数 , 那么我们就让每种债券的价格都 除以 1000 , 并且把 p 也除以 1000 , 这样就MTE , 也不会

DP基础总结

DP是一个不能更常用的算法了,这里也就对基础的五大类DP题型做个总结. 背包型 背包问题是很多教材上DP的引入题,它也确实是基础中的基础,总的来说背包型DP有01背包.部分背包.完全背包三种,其余的例如多重背包等都是衍生题目.直接看例题吧. 先看一道01背包. Codevs 1014装箱问题 这类题目只有两种状态,拿或不拿,所以叫01背包.状态转移方程还是比较好写的:f[i] = max{f[i], f[i-x]+x}.f[i]表示选到i的最大容积(箱内容积),最后用总的去减去f[v]就是ans

poj2642 The Brick Stops Here(DP基础题)

比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在这个范围内,求最小花费.(M.Cmin.Cmax有多种需求,分别输出花费) 题解: DP, f[i][j]表示选i种砖,含铜量的和为j时的最小花费.这样在询问M.Cmin.Cmax之前,先将各种砖数.组成各种含铜量的花费都算好. DP方程:f[k][j]=min(f[k][j],f[k-1][j-c

hdu 5616 Jam&#39;s balance(dp 正反01背包)

来自官方题解: AC代码: 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queu

区间DP基础篇之 POJ2955——Brackets

怒拿一血,first blood,第一个区间DP,第一次就这样子莫名其妙不知不觉滴没了~~~ 题目虽然是鸟语,但还是很赤裸裸的告诉我们要求最大的括号匹配数,DP走起~ dp[i][j]表示区间[i,j]的最大匹配数,那么最重要的状态转移方程就是: dp[i][j]=max(dp[i][k]+dp[k+1][j]) 对啦,要先初始化边界啊,两步走~: memset(dp,0,sizeof dp); if str[i]==str[i+1]   则:dp[i][i+1]=2       请看---->

区间DP基础篇之 POJ1159——Palindrome

题目大意:给定一个字符串,求最少插入几个字符让该字符串成为回文串 法一: dp[i][j]表示使区间[i,j]成为回文串最小插入的字符数,则状态转移方程 1.if s[i]==s[len-1] 则:d[i][j]=d[i+1][j-1] 2.else  d[i]=min(dp[i+1][j],dp[i][j-1]) 首尾字符不同的时候,有两种决策. 1.将新字符插在首位,那么状态就变成了dp[i+1][j]了. 2.将新字符插在末尾,则状态就变成了dp[i][j-1]了 .比较两种决策哪种更优就

hdu1257(dp基础)

最近早上要上课的时候都只能做一些 dp基础了.不过今天感觉还是十分失败的,我决定明天我要在脖子上搭一条湿毛巾,so hot! 题目很简单,读起来就很经典,可是我想了蛮久的..四十分钟最后才AC,真心弱. 大概意思是:中文题哦!!还要解释吗? 我的dp做法很暴力啊,我个人认为!!!!46MS,看来数据还是很正常的. /*********************************************************** > OS : Linux 3.2.0-60-generic #