![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【动态规划】
文章平均质量分 75
欧拉士大夫
在校期间是渣渣ACMer,现在是一名FPGAer/ICer。热爱新技术。
展开
-
hdu 2159 FATE
题目: 链接:点击打开链接算法: 二维的完全背包;思路: 状态转移方程:dp[j][m] = max(dp[j][m],dp[j-b[i]][m-1]+a[i]);表示用j的忍耐度杀死m个怪兽能够得到的最大的经验值。代码:#include#include#includeusing namespace std;int dp[110][110];原创 2014-05-16 23:52:11 · 518 阅读 · 0 评论 -
hdu 3496 Watch The Movie
题目: 链接:点击打开链接题意: 想看n个电影,只能从中选m个,用l时间来看,这n个电影都要花费时间a[i]去看,也有一定的价值b[i],选取最大的价值。思路: 这是二维费用背包,总时间l是背包容量,选m个是隐藏的花费,每个电影需要的时间a[i]也是花费。这样,状态转移方程就有了:dp[i][j] = max( dp[i][j] , dp[i-1][j-a[i原创 2014-05-21 22:03:42 · 549 阅读 · 0 评论 -
背包问题问法的变化(背包九讲)
前言: 以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。还有,如果要求的是“总价值原创 2014-06-01 10:52:32 · 1308 阅读 · 0 评论 -
二维费用背包问题(背包九讲)
问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有 一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和 b[i]。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w[i]。原创 2014-05-21 19:19:41 · 1750 阅读 · 0 评论 -
分组的背包问题(背包九讲)
问题: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法: 这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权原创 2014-05-23 16:39:34 · 3846 阅读 · 0 评论 -
hdu 1712 ACboy needs your help
题目: 链接:点击打开链接题意: n个课程m天完成,a[i][j]表示用j天完成第i个课程得到的价值,求最大价值。算法: 分组背包。思路: m天是总容量,n是组数。代码:#include#include#includeusing namespace std;int n,m;int a[110][原创 2014-05-25 00:12:42 · 737 阅读 · 0 评论 -
hdu 3033 I love sneakers!
题目: 链接:点击打开链接题意: xx喜欢收集鞋子,n,m,k分别表示鞋子的总数,xx的钱和鞋子的品牌数目。然后给出每个鞋子的信息有:a,是那种品牌,b,鞋子的标价,c,收藏鞋子得到的价值。对于一个收藏家来说,每种品牌的鞋子只收集一种,求出xx能够得到的最大的收藏价值。算法: 分组背包问题。思路: m总的钱数是背包原创 2014-05-26 17:31:38 · 659 阅读 · 2 评论 -
hdu 1224 Free DIY Tour(dp)
题目: 链接:点击打开链接题意: 思路:代码:#include #include #include using namespace std;int map[110][110];int dp[110],next[110],ins[110];int t,n,m;void output(int x){ if(x == -1)原创 2014-06-30 19:19:38 · 460 阅读 · 0 评论 -
有依赖的背包问题(背包九讲)
问题: 这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。原创 2014-05-29 11:04:29 · 2606 阅读 · 0 评论 -
hdu 1011 Starship Troopers (依赖背包 树形dp)
题目: 链接:原创 2014-05-31 22:10:13 · 958 阅读 · 0 评论 -
hdu 3449 Consumer (依赖01背包)
题目: 链接:点击打开链接题意:思路: dp[i][j]表示前i个箱子装j钱的材料能够得到的最大价值。代码:#include#include#includeusing namespace std;#define MAXN 100010int dp[55][MAXN];int main(){ //freopen("inpu原创 2014-06-01 00:48:54 · 1056 阅读 · 1 评论 -
混合三种背包问题(背包九讲)
问题: 如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合: 考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别原创 2014-05-18 22:25:15 · 1504 阅读 · 0 评论 -
多重背包问题(来源:背包九讲)
问题: 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本算法: 这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰原创 2014-05-17 00:41:44 · 1182 阅读 · 0 评论 -
01背包问题的学习(来源:背包九讲)
问题: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。思路: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c原创 2014-05-15 19:36:16 · 837 阅读 · 0 评论 -
hdu 2602 Bone Collector
题目; 点击打开链接代码;#include#include#includeusing namespace std;struct beibao{ int val; int vol;}bag[1010];int main(){ int dp[1010]; int i,j,n,v; int t; cin>>t; wh原创 2014-05-15 20:54:07 · 694 阅读 · 0 评论 -
hdu 1114 Piggy-Bank
题目: 链接:点击打开链接题意: 知道存钱罐的质量和装满硬币的存钱罐的质量,然后是不同硬币的价值和质量,求出存钱罐里钱币的最小价值。算法: 完全背包问题,银币的个数是不限的。思路: 状态转移方程:j = 0时,价值为0dp[j] = min(dp[j],dp[j-w[i]]+v[i]);//表示质量为j的钱币,含有的最小的价值代码:#原创 2014-05-16 09:43:39 · 565 阅读 · 0 评论 -
hdu 1284 钱币兑换问题
题目: 链接:点击打开链接算法: 完全背包。 状态转移方程: dp[j] += dp[j-i];dp[j]表示钱j可以兑换的方法,,,,,i是硬币的价值1,2,3,,,个数是不限的代码:#include#include#includeusing namespace std;int dp[40000];int n;int main(原创 2014-05-16 19:11:32 · 544 阅读 · 0 评论 -
hdu 2955 Robberies
题目: 链接:点击打开链接题意: roy抢银行,知道每个银行的存款和被抓的概率,以及Roy能够被抓的概率,求他能够抢劫的最多的money。思路: dp[i]表示抢劫i块钱不被抓的概率,当i==0时,一定不会被抓,即dp[0] = 1;代码:#include#include#includeusing namespace std;#define M原创 2014-05-15 21:48:40 · 655 阅读 · 0 评论 -
完全背包(背包九讲)
题目: 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。思路: 这个问题非常类似于01背包问题,所 不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解 0原创 2014-05-15 22:49:20 · 519 阅读 · 0 评论 -
hdu 3127 WHUgirls
题目: 链接:点击打开链接题意: 武汉大学有很多漂亮的妹纸,,,,,,,他们有一块待剪的布,他们想把它剪成很多小块做围巾,每个人喜欢不同的风格,他们把每一块的价值写在了纸上,现在有一个机器,可以把一块布剪成两块矩形的布,要求你用这台机器把原始的大布剪成纸上出现的小布,他们希望的到小块布的价值最大,当然不要求用完所有的布。。思路: 首先它是一个背包问题:1>大布原创 2014-05-17 12:25:16 · 674 阅读 · 0 评论 -
hdu 1171 Big Event in HDU
题目: 链接:点击打开链接题意: 给出N种设备的价值和数量,怎样尽可能的平分。算法: 多重背包。思路: 1.转化为01背包解决。2.使用单调队列优化O(VN)算法。代码: 法一:#include#include#includeusing namespace std;int n;int v[55],m[55];int原创 2014-05-18 16:54:26 · 529 阅读 · 0 评论 -
hdu 2844 Coins
题目: 链接:点击打开链接题意: 有n个硬币,知道其价值A1。。。。。An。数量C1。。。Cn。问在1到m价值之间,最多能组成多少种价值。思路: dp[i]表示i价值能够组成的最大种数。代码:#include#include#includeusing namespace std;int n,m;int a[110],c[110];int原创 2014-05-18 09:04:05 · 699 阅读 · 0 评论 -
hdu 1059 Dividing
题目: 链接:点击打开链接题意: 判断是否能够平分弹珠。算法: 多重背包。思路: 模板。。。dp[i]中i表示花费。。代码:#include#include#includeusing namespace std;int n[7];int dp[120010];int V;void bag_01(int c,int w)/原创 2014-05-18 12:40:52 · 958 阅读 · 0 评论 -
hdu 1561 The more, The Better (依赖背包 树形dp)
题目: 链接:点击打开链接题意: 很明显的依赖背包。思路:代码:原创 2014-06-01 00:31:16 · 1002 阅读 · 0 评论