0-1背包问题

来源:互联网 发布:豆瓣发帖搜索知乎 编辑:程序博客网 时间:2024/06/04 20:41

0-1背包问题:

问题描述

给定n种物品和一个背包。物品i的重量是w(i),其价值是v(i),背包的容量为c。
问应该如何选择装入背包中的物品,使得装入背包中物品总价值最大?

这里主要是对《计算机算法设计与分析(第三版)》中86页后开始讨论。

设m(i,j) 为在物品i~n中,在容量为j的情况下的最大价值

i=n时,可选的物品为n~n,所以只有第n个物品可以选
此时
m(n,j) = v(n) j>=w(n)
或 0 0<=j < w(n)

此时这个画在坐标系中是这样子的:(注意这里i已经为定值n了,此时已经不是变量)
这里写图片描述
注意到这里有两个跳跃点(0,0)和(w(n),v(n))
我们描述m(n,j)这个函数也就可以用这两个跳跃点就可以了。

当i=n-1时,
m(n-1,j) = max {m(n,j) , m(n,j-w(n-1))+v(n-1) }

于是那本书引出这个递推

m(i,j) = max {m(i+1,j) , m(i+1,j-w(i))+v(i) }

m(i,j)的值在m(i+1,j) 和 m(i+1,j-w(i))+v(i) 中最大值选择。
继续重申一遍,这里i不是变量,只有j才是变量。

这个表达式表述出通俗点是什么意思呢?
当m(i,j)等于m(i+1,j)时候,意思是加入第i件物品以供我们选择后,最大价值却跟没加这件物品一样,我们此时并没有挑这件物品
而当m(i,j)等于 m(i+1,j-w(i))+v(i) 时候,我们是先挑中第i件商品,预算中先扣掉它,然后加上剩下的容量所能达到的最大值。

也就是说,计算m(i,j),我们会考虑这样,一种是先不选第i件物品,然后它的最大价值就跟m(i+1,j)一样。另一种是先挑下第i件物品 v(i),然后加上剩下的最大价值m(i+1,j-w(i))。

好了,之前我们提到跳跃点,我们记m(i+1,j)的跳跃点集合为p[i+1] 。集合里面的元素表现形式为(j,m(i,j));
那么m(i+1,j-w(i))+v(i)与m(i+1,j)的图像有什么联系呢?

我们设m(i+1,j-w(i))+v(i)的跳跃点集合为q[i+1] 。
对一个跳跃点(s,t)属于q[i+1],则有
t=m(i+1,s-w(i))+v(i)
t-v(i) = m(i+1,s-w(i))
所以 (s-w(i),t-v(i))属于p[i+1]。
这里说明啥呢?其实q[n+1]点集合也是可以求出来的,q[n+1]中的元素(s,t)通过减法就是得到在p[n+1]中的元素(s-w(i),t-v(i))。

所以
q[i+1] = p[i+1] ⊕ (w(i),v(i))={ (j+w(i),m(i,j)+v(i)) | (j,m(i,j)) 属于p[i+1] }

此时q[n+1] 和p[i+1]都求出来了。
那么如何定义q[n]呢?

我们知道q[n]的跳跃点肯定在这两个的并集中,是不是照单全收呢?
仔细思考一下,这里是求其中的max,其实这两个的函数图像层叠在一起的时候,我们可能在某个区间会去掉其中一个,因为去掉的那个不够max。
这也就是书上说的去掉受控点的意思。
这里写图片描述
p[i] = p[i+1] U q[i+1] 并且去掉受控点。

原创粉丝点击