ImageVerifierCode 换一换
格式:DOC , 页数:25 ,大小:203.50KB ,
资源ID:3496182      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3496182.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(背包问题九讲_DOC版(测试一下百度文库的功能).doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

背包问题九讲_DOC版(测试一下百度文库的功能).doc

1、Comment 木木木木1: 佛挡杀佛背包问题九讲 v1.0目录 第一讲 01 背包问题 第二讲 完全背包问题 第三讲 多 重背包问题 第四讲 混 合三种背包问题 第五讲 二维 费用的背包问题 第六讲 分组 的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附:U SACO中的 背包问题 前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的 NOIP难度的动态规划总结,名为解动态规划题的基本思考方式。现在你看到的是这个写作计划最先发布的一部分。1背包问题是一个经典的动态规划模型。它既简单形象容易理解,

2、又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的第一部分。读本文最重要的是思考。因为我的语言和写作方式向来不以易于理解为长,思路也偶有跳跃的地方,后面更有需要大量思考才能理解的比较抽象的内容。更重要的是:不大量思考,绝对不可能学好动态规划这一信息学奥赛中最精致的部分。你现在看到的是本文的 1.0正式版。我会长期维护这份文本,把大家的意见和建议融入其中,也会不断加入我在 OI学习以及将来可能的 ACM-ICPC的征程中得到的新的心得。但目前本文还没有一个固定的发布页面,想了解本文是否有1 更新版本发布,可以在 OIBH 论坛中以“背包

3、问题九讲”为关键字搜索贴子,每次比较重大的版本更新都会在这里发贴公布。目录第一讲 01 背包 问题这是最基本的背包问题,每个物品最多只能放一次。第二讲 完全背包问题第二个基本的背包问题模型,每种物品可以放无限多次。第三讲 多重背包问题每种物品有一个固定的次数上限。第四讲 混合三种背包问题将前面三种简单的问题叠加成较复杂的问题。第五讲 二维费用的背包问题一个简单的常见扩展。第六讲 分组的背包 问题一种题目类型,也是一个有用的模型。后两节的基础。第七讲 有依赖的背包问题另一种给物品的选取加上限制的方法。第八讲 泛化物品我自己关于背包问题的思考成果,有一点抽象。第九讲 背包问题问法的变化试图触类旁通

4、、举一反三。附:USACO 中的背包问题给出 USACO Training 上可供练习的背包问题列表,及简单的解答。联系方式如果有任何意见和建议,特别是文章的错误和不足,或者希望为文章添加新的材料,可以通过 http:/ 阿坦 jason911 donglixp 他们每人都最先指出了本文第一个 beta 版中的某个并非无关紧要的错误。谢谢你们如此仔细地阅读拙作并弥补我的疏漏。感谢 XiaQ,它针对本文的第一个 beta 版发表了用词严厉的六条建议,虽然我只认同并采纳了其中的两条。在所有读者几乎一边倒的赞扬将我包围的当时,你的贴子是我的一剂清醒剂,让我能清醒起来并用更严厉的眼光审视自己的作品。当

5、然,还有用各种方式对我表示鼓励和支持的几乎无法计数的同学。不管是当面赞扬,或是在论坛上回复我的贴子,不管是发来热情洋溢的邮件,或是在即时聊天的窗口里竖起大拇指,你们的鼓励和支持是支撑我的写作计划的强大动力,也鞭策着我不断提高自身水平,谢谢你们!最后,感谢 Emacs 这一世界最强大的编辑器的所有贡献者,感谢它的插件 EmacsMuse 的开发者们,本文的所有编辑工作都借助这两个卓越的自由软件完成。谢谢你们自由软件社群为社会提供了如此有生产力的工具。我深深钦佩你们身上体现出的自由软件的精神,没有你们的感召,我不能完成本文。在你们的影响下,采用自由文档的方式发布本文档,也是我对自由社会事业的微薄努

6、力。P01: 01 背包问题题目有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 ci,价值是 wi。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即 fiv表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。则其状态转移方程便是:fiv=maxfi-1v,fi-1v-ci+wi这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前 i 件物品放入容量为 v 的背包中”这个子问题,若只考虑第 i 件物品的策略(放或不放),那么就可以

7、转化为一个只牵扯前 i-1 件物品的问题。如果不放第 i 件物品,那么问题就转化为“前 i-1件物品放入容量为 v 的背包中”,价值为 fi-1v;如果放第 i 件物品,那么问题就转化为“前 i-1 件物品放入剩下的容量为 v-ci的背包中”,此时能获得的最大价值就是 fi-1v-ci再加上通过放入第 i 件物品获得的价值wi。优化空间复杂度以上方法的时间和空间复杂度均为 O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到 O(V)。先考虑上面讲的基本思路如何实现,肯定是有一个主循环 i=1.N,每次算出来二维数组 fi0.V的所有值。那么,如果只用一个数组 f0.V,

8、能不能保证第 i 次循环结束后 fv中表示的就是我们定义的状态 fiv呢?fiv是由 fi-1v和 fi-1v-ci两个子问题递推而来,能否保证在推 fiv时(也即在第 i 次主循环中推 fv时)能够得到 fi-1v和 fi-1v-ci的值呢?事实上,这要求在每次主循环中我们以 v=V.0 的顺序推 fv,这样才能保证推 fv时 fv-ci保存的是状态 fi-1v-ci的值。伪代码如下:for i=1.Nfor v=V.0fv=maxfv,fv-ci+wi;其中的 fv=maxfv,fv-ci一句恰就相当于我们的转移方程 fiv=maxfi-1v,fi-1v-ci,因为现在的 fv-ci就相当

9、于原来的fi-1v-ci。如果将 v 的循环顺序从上面的逆序改成顺序的话,那么则成了 fiv由 fiv-ci推知,与本题意不符,但它却是另一个重要的背包问题 P02 最简捷的解决方案,故学习只用一维数组解 01 背包问题是十分必要的。事实上,使用一维数组解 01 背包的程序在后面会被多次用到,所以这里抽象出一个处理一件 01 背包中的物品过程,以后的代码中直接调用不加说明。过程 ZeroOnePack,表示处理一件 01 背包中的物品,两个参数 cost、weight分别表明这件物品的费用和价值。procedure ZeroOnePack(cost,weight)for v=V.costfv=

10、maxfv,fv-cost+weight注意这个过程里的处理与前面给出的伪代码有所不同。前面的示例程序写成v=V.0 是为了在程序中体现每个状态都按照方程求解了,避免不必要的思维复杂度。而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。费用为cost 的物品不会影响状态 f0.cost-1,这是显然的。有了这个过程以后,01 背包问题的伪代码就可以这样写:for i=1.NZeroOnePack(ci,wi);初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方

11、法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了 f0为 0 其它f1.V均设为-,这样就可以保证最终得到的 fN是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f0.V全部设为 0。为什么呢?可以这样理解:初始化的 f 数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为 0 的背包可能被价值为 0 的 nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”

12、,这个解的价值为 0,所以初始时状态的值也就全部为 0 了。这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。小结01 背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成 01 背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。首页P02: 完全背包问题题目有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物品的费用是 ci,价值是 wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大

13、。基本思路这个问题非常类似于 01 背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取 0 件、取1 件、取 2 件等很多种。如果仍然按照解 01 背包时的思路,令 fiv表示前 i 种物品恰放入一个容量为 v 的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:fiv=maxfi-1v-k*ci+k*wi|0=wj,则将物品 j 去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得 j 换成物美价廉的 i,得到至少不会更差的方案。对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。

14、然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。这个优化可以简单的 O(N2)地实现,一般都可以承受。另外,针对背包问题而言,比较不错的一种方法是:首先将费用大于 V 的物品去掉,然后使用类似计数排序的做法,计算出费用相同的物品中价值最高的是哪个,可以 O(V+N)地完成这个优化。这个不太重要的过程就不给出伪代码了,希望你能独立思考写出伪代码或程序。转化为 01 背包问题求解既然 01 背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为 01 背包问题来解。最简单的想法是,考虑到第 i 种物品最多选 V/ci件,于是可以把第 i 种物品转化为 V

15、/ci件费用及价值均不变的物品,然后求解这个 01 背包问题。这样完全没有改进基本思路的时间复杂度,但这毕竟给了我们将完全背包问题转化为 01 背包问题的思路:将一种物品拆成多件物品。更高效的转化方法是:把第 i 种物品拆成费用为 ci*2k、价值为 wi*2k的若干件物品,其中 k 满足 ci*2k0 的最大整数。例如,如果 ni为 13,就将这种物品分成系数分别为 1,2,4,6 的四件物品。分成的这几件物品的系数和为 ni,表明不可能取多于 ni件的第 i 种物品。另外这种方法也能保证对于 0.ni间的每一个整数,均可以用若干个系数的和表示,这个证明可以分 0.2k-1 和 2k.ni两段来分别讨论得出,并不难,希望你自己思考尝试一下。这样就将第 i 种物品分成了 O(log ni)种物品,将原问题转化为了复杂度为O(V*log ni)的 01 背包问题,是很大的改进。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。