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] 并且去掉受控点。
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 0-1背包问题
- 0-1背包问题
- 0/1背包问题
- 字符串的替换python
- hdu 1244
- C++学习
- 基类指针指向派生类对象
- 基于GPU加速的三维VTI介质一阶拟声波方程有限差分地震正演模拟
- 0-1背包问题
- Markdown常用语法(不定期更新)
- 运放的自激
- XZ_HTML5之实现瀑布流的3种方式
- centos安装与配置,最好用的配置
- mac命令行操作mysql
- 数学建模--画图
- HDU 1541 Stars(树状数组)
- 常见异常处理