您的位置:首页 > 其它

01背包问题

2015-04-05 10:11 225 查看
01背包问题是一个经典 的动态规划的问题,现在再拿出来分享一下。

具体的,背包问题一个例子来说就是:现在假设你有个背包,容量是只能装下重量为V=10kg的物品,现在桌子上有若干物品,但是不能把物品拆开拿走。假设现在有四种物品,wt={5,4,6,3}kg, 价值分别是val={10,40,30,50}。问题是在背包容量一定的情况下,应该如何拿物品,使得背包中的物品的总价值最大。

那么该如何求解呢?按照动态规划的思想就是说先把局部的解求出,然后再扩展到全局的问题解。

首先构建物品X在不同重量时候的价值数组V

V[][]=(4+1)*(10+1) //5行11列
<img src="http://img.blog.csdn.net/20150405102542902?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmpxY3lxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
该数组的每一行代表一件物品,每一列代表背包的容量的大小。所以矩阵为5*11.对于矩阵的第0列,代表背包没有容量,物品的价值当然为0.矩阵的第0行代表没有物品,背包总价值当然也为0.

下面的主要工作就是把该数组进行填写。由上可知我们吧该矩阵的第一行和第一列全部设为0.然后我们观看矩阵的第二行,即item1.item1的重量对应于wt中的5,即第一件物品。在填写的过程中,我们不断比较第一件物品的重量和背包的容量,当背包的容量大于等于物品的重量的时候,那么此时我们就可以把物品放入背包,在放入背包之后,在对应的位置填写该物品对应的价值,即10.我们在填写第一个物品的时候,只考虑第一件物品,别的物品不考虑。

然后再填写玩第一件物品,再填写第二件物品。其中关键的地方就是当当前背包的容量大于等于当前物品的重量+之前背包中放入的物品的重量时候,就进行判断,观察是当前物品的价值大还是两者之和大,然后不断更新该数组。

未完待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: