`
javababy1
  • 浏览: 1166763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

01背包问题

 
阅读更多

问题描述:

有 n 件物品x1, x2, …, xn , 每件物品有一个价值和一个重量,分别记为:

v1,v2, …vn

w1,w2, …wn

其中所有的 wi 均为整数。 现有一个背包,其最大载重量为m,要求从这n件物品中任取若干件(这些物品每样只有一件,要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大? (我们只需要求出最大价值,不需要求出具体拿的是哪些物品)

例如,m=23, n = 5,

vi : 19 24 33 45 50

wi : 5 6 8 11 12

最大价值为:95

分析:

如果想用贪心,先求出平均价值,然后从高到低的方法来取,如果有一个背包的容量为10,共有3个物品,体积分别是3、3、5,价值分别是6、6、9,那么你的方法取到的是前两个物品,总价值是12,但明显最大值是后两个物品组成的15。因此贪心的方法不能得到正确结果。

换一个更简单的方式来思考:每个物品只有2种选择,要么放入,要么不放入。

(1)放入:问题转换为在背包载重为m-wi的情况下,在其它n-1件物品中挑选,求得价值和最大。等把这个子问题求出后,再加上vi的价值就是整个问题的最优解了。

(2)没放入:那么就当xi 根本不存在,直接解物品数量为n-1,背包载重为m的子问题。子问题的最优解就是问题的最优解。

定义函数f(i,j)为在1~i 件物品中选若干件装入限重为 j 的背包中的最大价值和, 那么根据上面关于第 i 件物品是否装入了背包的情况分析,我们得出关系式:

(1)当第I件物品要装入背包时,f(i,j) := (i-1件物品,限重为j-w[i]的最优解)+ v[i], 即: f(i,j) := f(i-1, j-w[i]) + v[i]

当然,第i件物品要装入是有条件限制的:第i 件物品重量小于等于背包限重,即 w[i] <= j

(2)当第i件物品不装入背包时,f(i,j) :=i-1件物品,限重为m的最优解,即: f(i,j) := f(i-1, j)

求得装入或者不装入第i 件物品的限重为J的背包的最大价值,只需要比较这两种情况下谁的价值更大,更大者为当前问题的最优解。

f(i,j)=max{f(i-1, j-w[i]) + v[i] , f(i-1, j)} 该方程递归结束的边界条件是:当j=0时,f(i,0)=0。

在按自底向上的动态规划方式求解问题时,其实主要就是做一件事:

按问题规模从小到大地求解问题,把每阶段求得的问题的最优解保存在表格(数组)中,以便在下一阶段求解更大的问题时,可以直接查表引用子问题的最优解。 (类似于递推)

阶段的分析:

将n件物品放入背包,故可以把阶段划分为n个。把在前I件物品中选取物品放入背包作为第I个阶段。

状态的分析:

在第i 个阶段有多少个状态呢?因为包的容量为m,故在每个i 阶段都有m个状态:f(i,1)、f(i,2)、f(i,3)……f(i,m-1)、f(i,m)。

而这m个问题的求解基础是第I-1个阶段的m个子问题。这些子问题的最优解已经先于此时求得,保存在f[I-1,1], f[I-1,2], …, f[I-1,m]中,现在只需要直接引用它们的值就可以了。这就是动态规划自底向上的体现。

之所以能求得之前的状态,是因为有一个边界:f(i,0)=0。

决策的分析:

只有两个,在前I件物品中,限重为J的条件下,装入第I件物品还是不装入第I件物品。比较这两种情况的价值和,谁大谁就是最优解。

01背包问题 - Fly - 飛

转载自:http://www.cnblogs.com/gzydn/archive/2009/06/11/1501439.html

分享到:
评论

相关推荐

    遗传算法解决01背包问题分析及代码

    01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。01背包问题的一般描述如下: 给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。选择...

    贪婪法解决01背包问题

    贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题

    01背包问题的C语言代码

    01背包问题的源代码,C语言编写,绝对可以运行。

    用回溯法解决01背包问题C语言实现

    01背包问题是一个很经典的问题,在这里我用回溯法解决。希望大家一起来探讨呀!

    01背包问题_01背包问题_

    课程作业,实现算法实践书后的例题,实现01背包问题

    beiBao01_免疫克隆解决01背包问题_01背包_免疫克隆算法_

    免疫克隆解决01背包问题,将免疫概念及其理论应用于遗传算法,在保留原算法优良特性的前提下,力图有选择、有目的地利用待求问题中的一些特征信息或知识来抑制其优化过程中出现的退化现象,这种算法称为免疫算法...

    Python基于回溯法解决01背包问题实例

    主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友可以参考下

    利用动态规划解决01背包问题

    利用动态规划算法实现了01背包问题,并取得了良好的效果。

    分治法求01背包问题c语言

    分治法求01背包问题c语言 已调通

    回溯法和动态规划法解01背包问题

    回溯法和动态规划法解01背包问题,控制台应用程序,代码没有编译完成,请自行编译

    c c++ 01背包问题动态规划解决

    01背包问题解决方法不少,动态规划是其中之一,动态规划的问题解题思路都差不多(一些浅见),基本要素是最优子结构性质,子问题重叠性质,自底向上的求解方法。只要了解了基本要素,那么这种题型也会更好理解。本题...

    01背包问题的贪心算法.pdf

    01背包问题的贪心算法,详细解析,令你很快懂的01背包问题中的贪心算法思想

    01背包问题(动态规划法).pdf

    文档详细地解释了动态规划法解决01背包问题,包括算法设计思想、算法改进思想、存储结构、算法实现,是一篇来自计算机读报的文章,适合各位对动态规划存在疑问的同学好好品读。

    01背包问题 回溯法

    C语言实现01背包问题 回溯法 算法分析题答案

    01背包问题测试数据

    0-1背包问题测试数据,内含多组测试数据,物品的价值量及其重量,复制粘贴即可使用

    01背包问题回溯法解决子集树

    本代码大量注释,便于理解。回溯法解决01背包问题,相对于动态规划来说,我们首先得了解问题的解空间,了解解空间的组织结构,最后搜索解空间,其中加入约束条件和限界条件是关键,否则就是穷举了。

    01背包问题-四种方法

    01背包问题,四种方法(动态规划、贪心、回溯、分支限界)

    C++编写的01背包问题

    C++编写的01背包问题,用的动态规划的思想,用于学习算法课程,内包含程序解决问题及源代码,可以运行。

    经典遗传算法(SGA)解01背包问题的python代码实现

    经典遗传算法(SGA)解01背包问题的python代码实现,说明如下: 1.采用经典的二进制编码,选择算子为轮盘赌选择,交叉算子为两点交叉,变异算子为反转(单点)变异 2.可调的参数为:gen,pc,pm,popsize,n,w,c,W,M 3.两...

    01背包问题-Java-回溯法

    本程序是用Java开发的,使用回溯法解决01背包问题。程序比较易懂。输入分三行,第一行是物品数量N和背包容量C,第二行是物品重量数组,第三行是价值重量数组。然后输出最优解。

Global site tag (gtag.js) - Google Analytics