动态规划-背包
文章平均质量分 67
leodestiny
这个作者很懒,什么都没留下…
展开
-
HDU 2602 Bone Collector 01背包
题意:有个人收集骨灰。每份骨灰有体积w,价值v。现在有N份骨灰,他有一个体积为V的箱子。问这个人能得到的最大价值是多少。思路:非常裸的01背包。注意:对自己提个醒,就是dp[i]的定义是:背包容量不大于i得到的最大价值。写代码的时候应该是记错了。代码如下:#include #include #include using namespace std;int w[1010]原创 2015-01-31 21:18:39 · 418 阅读 · 0 评论 -
POJ Relocation 状态压缩 01背包
题意:某夫妻要搬家。他们有两辆车,容量分别为C1,C2。有N个家具,体积为Ci。两人分别驾驶一辆车搬家具,至少要用几次才能把家具办完。思路:咋看这道题,没有思路。 观察了很久,才发现,在向车装入家具的时候,家具的顺序是没有关系的,对于家具比较重要的其实是把他放到哪辆车和第几次上。 因为顺序的无序性,我们就能想到了集合,以及用数来表示集合,这样最终原创 2015-02-02 21:10:30 · 604 阅读 · 0 评论 -
ZOJ Cookie Choice 多重背包 单调队列优化 分组背包 泛化物品求和
题意:一个人想买甜点。有N种不同的甜点,每种甜点有价值Ei,价格Pi。这个人对每种甜点想买Ki块。当Ki =0时,该甜点可以买无限块。 同时,因为有些甜点的味道相同,他将有些甜点分成了G组。每组内的甜点,最多买一种。 现在他有D元钱,想把这些钱全花光,而且最后得到的价值最大且非负,问是否有对应的方案,如果有,求出最大的价值。思路:不同类型的背包的原创 2015-02-05 09:30:28 · 623 阅读 · 0 评论 -
POJ 2392 Space Elevator 多重背包
题意:牛们想造一个尽可能高的塔。他们有N种方块,每种方块高h_i,有c_i个,但是这种方块只能在高度小于a_i时使用。问这个塔最高可以搭起到多高的高度。思路:没有高度限制的话,其实把所有的方块都用上,才是最高的高度。但是有了高度a_i限制后,就变成了容量限制的多重背包。 可以注意到,方块还要考虑摆放的顺序问题,不同的摆放顺序也会让塔的高度不一样。这样,我们就想能否按照高原创 2015-02-05 09:12:11 · 495 阅读 · 0 评论 -
POJ 1014 Dividing 多重背包
题意:有6种不同价值的石头,告诉你每种石头的数量。现在两个人要平分这些石头,希望每个人得到的价值相同的。问是否可以达到要求的方案。思路:标准的多重背包,因为找到是否存在解,把数量二进制分解就行了。代码如下:#include #include #include using namespace std;const int MAX = 200010;int a[MAX],dp原创 2015-02-05 09:00:42 · 514 阅读 · 0 评论 -
POJ Euro Efficiency 完全背包
题意:给出你6种货币的面值。让你求出,对于1-100中每个价值,至少需要多少枚硬币才能得到。对于价值i,需要的硬币定义为给出和收到的硬币的数量和。思路:因为需要的硬币包括给出和找零回来的钱,所以我们进行两边完全背包。注意:需要非常注意的一点是背包的容量。虽然最后的结果只是在1-100范围内,但是背包的容量是2000。因为99的硬币可以重复20次。代码如下:#include #in原创 2015-02-05 08:35:41 · 677 阅读 · 0 评论 -
多重背包的两种求解形式
1.将多重背包转化成01背包求解。 即将物品的数量M按照二进制分解成 M = 1 + 2 + 4 + ... + 2 ^ k + a. 然后对这些物品进行01背包。 如果没有求具体方案的,我们可以在求解的过程中进行分解,而不保留对应的物品。 具体代码如下: for(int i = 0; i < N; ++i){ int num = m[i];原创 2015-02-05 09:49:55 · 1008 阅读 · 1 评论 -
POJ 1384 Piggy-Bank 完全背包
题意:给出储钱罐初始的重量,放入钱后的重量。给出N种货币,货币的价值和重量。问储钱罐中钱的最少的价值是多少。思路:因为钱的数量可以认为是无限的,所以是个完全背包。注意:注意初始化。代码如下:#include #include #include using namespace std;const int MAX = 50000;int dp[MAX],w[MAX],v原创 2015-02-05 08:28:07 · 505 阅读 · 0 评论 -
POJ 2063 Investment 变形的完全背包
题意:John有X元钱。现在有D种理财产品,给出每种理财产品的价格(1000的整数倍),每年得到的回报。现在John想投资N年,问得到的最大回报是多少。思路:一件物品可以买无限次,这是个标准的完全背包。因为每年得到的回报可以作为下一年的资金,所以这里要发生变化的是背包的容量。代码如下:#include #include #include using namespace std;原创 2015-02-05 08:21:09 · 833 阅读 · 0 评论 -
HDU 3466 Proud Merchants 01背包 单机调度问题
题意:在一个国家里,有N件商品。每件商品有价格Pi,价值Vi,和一个神奇的属性Qi。Qi表示,当你的钱大于等于Qi的时候,才能买商品i。现在你有M元钱,希望你最大化买到的东西的价值和。思路:当没有属性Qi的时候,就是个标准的01背包。 当Qi被引入的时候,会发生什么变化呢?对于状态转移方程, dp[j] = max(dp[j],dp[j-p[i]]+v[i]).当没有Q原创 2015-02-03 09:27:47 · 600 阅读 · 0 评论 -
POJ 2184 Cow Exhibition 01背包
题意:有N头牛,每头牛有两个属性值:智慧Si,有趣Fi。现在要挑选牛去参加展览,希望被挑选的所有牛的Si值的和非负,Fi值的和非负,然后最大化Si和Fi的和。思路:对于每头牛的决策只有两种,选和不选。同时,当没有非负这个条件时,就是个标准的01背包。 但是加上这个限制后,会对我们造成什么影响呢?其实没什么影响,只是我们在最后找答案的时候不往负数方向去找就行了。原创 2015-02-02 20:57:15 · 450 阅读 · 0 评论 -
HDU 2639 Bone Collector II 01背包第K优解
题意:题意同前面的HDU2602,但是这里是要求01背包的第K优解。(排除重复的解)思路:在背包九讲中,说过,我们可以对于每一个dp[i]维护一个大小为K的队列。在状态转移的时候,将方程dp[j] = max(dp[j],dp[j-w[i]]+v[i]),替换成两个队列dp[j]和dp[j-w[i]] + v[i]的合并就行了。注意:初始化的问题:题目中说,如果没有第K优解,要输出0,我们原创 2015-02-02 21:05:34 · 511 阅读 · 0 评论 -
HDU 2955 Robberies 变形01背包
题意:Roy打算抢劫银行。有N个银行,每个银行有存款Mi,和被抢劫后抓住的概率Pi。不同银行被抓的概率是独立的。现在Roy希望将自己被抓的概率控制在P以下的同时,让自己抢劫到尽可能多的钱。思路:因为对于每个银行的决策只有两种选项:抢与不抢,所以这是个01背包。相对于被抓的概率,逃脱的概率更好求,最后我们只需1-逃脱的概率即可。 但是因为概率是个小数,我们没法用其表示状态原创 2015-02-02 20:34:13 · 391 阅读 · 0 评论 -
HDU 2126 Buy the souvenirs 01背包 输出方案数
题意:有N种纪念品,给出对应的价格。现在有N元钱,想买到最多的纪念品,同时输出所有可能的方案数。思路:因为纪念品可以买,也可以不买。所以是标准的01背包。 在求最大值的过程中,同时求出对应的方案数即可。注意方案数的计算。代码如下:#include #include #include using namespace std;int a[50];int原创 2015-02-02 21:38:54 · 673 阅读 · 0 评论 -
UVA 12563 Jin Ge Jin Qu hao 01背包
题意:在KTV里,你还剩余T秒的时间来唱歌。现在有N首歌曲,给出每首曲子的时间。同时还有一首必唱的,时间为678秒的歌曲。现在让你最大化唱的歌曲的数量,在此前提下,让自己唱的时间足够长。思路:对于每首歌曲的选择,只有两种,选或者不选,这就是标准的01背包。因为最终要的要求是最大化歌曲的数量,所以我们定义状态dp[i]为唱歌时间小于等于i的时候,唱的最多的歌曲数目。然后记录最大值即可。代码如原创 2015-02-02 22:31:54 · 563 阅读 · 0 评论 -
UVA 624 CD 01背包 输出解
题意:现在有N首歌曲,给出长度。将尽可能长的歌曲,刻录容量为N的磁带里。并输出对应的方案。思路:输出对应方案的01背包,我们需要在递推的过程中记录过程就行了。注意:以前只是写滚动数组的01背包,这回写完整的形式,手残了好几次。。#include #include #include using namespace std;int w[50],dp[50][2000],s[50][原创 2015-01-31 21:44:18 · 638 阅读 · 0 评论 -
UVA 562 Dividing coins 01背包
题意:有N枚硬币,每个硬币的面值不一样。现在讲这些硬币分给两个人,求这两个人分得硬币的差的最小值。思路:首先要想到时,因为硬币面值的总和是一定的。那知道一个人得到的面值总和,就可以得到另外一个人的面值总和。(逆向思维?) 这样对于一个硬币,我们给第一个人还是给第二个人,其实对于一个人来说,就是这个人得没得到这枚硬币。01背包问题吧。 但是怎样找对原创 2015-01-31 22:19:56 · 640 阅读 · 0 评论 -
HDU 2546 饭卡 01背包
题意:电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 思路:没有5元的限制的话,就是个标原创 2015-01-31 21:24:44 · 448 阅读 · 0 评论 -
HDU 4281 Judges' response 状态压缩 01背包 MTSP
题意:比赛上,有N个选手提出了问题,解决每个选手的问题需要的时间是Ci。现在每个裁判至多能为选手解答时间长为M的问题。至少需要几个裁判才能解决所有的选手的问题。 同时,给出每个选手的位置坐标xi,yi.希望所有裁判从起始点出发,解决完所有问题,再回到起始点,所走的距离和最小。思路:其实这两问的答案是基本没有关系。唯一的关系,就是如果第一问没有解的话,第二问也是没有解的。原创 2015-02-03 14:31:27 · 801 阅读 · 0 评论