- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用动态规划解决01背包问题
利用动态规划解决01背包问题[摘要]在计算机越来越普及的今天,人们对计算机的求知欲日渐增长,对计算速度的要求也越来越高,因此算法也越来越受人重视,好的算法可以加快计算速度和减少系统资源。
动态规范是算法里一种非常重要的方法,是求解决策过程最优化的数学方法。动态规划自问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其他方法求解更为方便。
本文通过对经典的01背包问题的求解,从动态规划的角度进行阐述,通过案例对该算法的计算过程进行了直观的描述,并对该算法进行了一定的优化,最后指出该算法的优缺点。
[关键词]背包 动态规划 时间复杂度 空间复杂度
[中图分类号]TP31[文献标识码]A[文章编号]1009-5349(2010)05-0121-03
前言
背包问题是一个经典的动态规划模型,很多关于算法的教材都把它作为一道例题,该问题既简单又容易理解,而且在某种程度上还能够揭示动态规划的本质。
将具有不同重量和价值的物体装入一个有固定载重量的背包,以获取最大价值,这类问题被称为背包问题。
背包问题可以扩展出很多种问题,而01背包问题是最常见、最有代表性的背包问题。
一、问题描述
给定一个载重量为M的背包及n个物体,物体i的重量为wi、价值为pi,1≤i≤n,要求把这些物体装入背包,使背包内的物体价值总量最大。此处我们讨论的物体是不可分割的,通常称这种物体不可分割的背包问题为01背包问题。
二、基本思路
01背包问题的特点是:每种物体只有一件,可以选择放或者不放。假设:xi表示物体i被装入背包的情况,xi=0,1。当xi=0时,表示物体没有被装入背包;当xi=1时,表示物体被装入背包。根据问题的要求,有如下的约束方程(1)和目标函数(2):
三、利用动态规划法求解01背包问题
(一)动态规划算法的基本思想
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中,这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。
(二)算法设计
假定背包的载重量范围为0~m。类似于资源分配那样,令optpi(j)表示在前i个物体中,能够装入载重量为j的背包所得的最大价值,j=1,2,……,m。显然,此时在前i个物体中,有些物体可以装入背包,有些物体不能装入背包。于是,可以得到下面的动态规划函数:
(4)式表明:把前面i个物体装入载重量为0的背包,或者把0个物体装入载重量为j的背包,得到的价值都为0。(5)式表明:当第i个物体的重量大于背包的载重量时,装入前i个物体得到的最大价值,与装入前i-1个物体得到的最大价值一样,即第i个物体没有装入背包。(6)式表明:当第i个物体的重量小于背包的载重量时,如果第i个物体装入背包,背包中物体的价值,等于把前i-1个物体装入载重量为j-wi的背包所得到的价值与第i个物体的价值pi之和;如果第i个物体没有装入背包,则背包中物体的价值,等于把前i-1个物体装入载重量为j的背包,却不装入第i个物体所取得的价值。显然,这两种装入方法,在背包中所取得的价值不一定相同,因此,取这两者中的最大值,作为把前面i个物体装入载重量为j的背包所取得的最优价值。
该算法可分为n阶段:
第一阶段,只装入一个物体,计算在不同载重量的背包情况下,所取得的最大价值;
第二阶段,装入前两个物体,按(5)式和(6)式计算在不同载重量的背包情况下,取得的最大价值;
……
第n阶段,装入前n个物体,按(5)式和(6)式计算在不同载重量的背包情况下,取得的最大价值,而在背包载重量为M时,所得结果就是我们想要的结果。
为了确定具体哪个物体装入背包,从optpn(m)的值向前倒推。有如下递推关系式:
(7)式表明:如果optpi(j)大于optpi-1(j),则物体i被装入背包;如果optpi(j)等于optpi-
文档评论(0)