0-1背包问题
Posted 为你花开满城,灯明三千
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-1背包问题相关的知识,希望对你有一定的参考价值。
1. 问题
2. 解析
价值密度pi/wi 贪婪算法,这种选择准则为:从剩余物品中选择可装入包的pi/wi值最大的物品。
思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止。
定理:对于任何正整数 k, 算法 (轻者先装)对 k 个集装箱的实例得到
最优解。
证明(数学归纳法):
(1)k=1,集装箱个数为1且重量小于c,任何装法都只有一种方式,因此都是最优解,因此轻者先装也是最优解。
(2)归纳假设:假设算法对于规模为 k 的输入都能得到最优解。
则对于k+1的输入,
通过拿掉最轻的集装箱能够得到规模为k的输入
根据归纳假设,对于 k 个输入,N’、W’、C’的最优解为 I’,即 I’为 N’的最优解(归纳假设得)
令 ,那么I必然是N的最优解,这也是算法对于 N,W,C 的解。
证明:I 必然是 N 的最优解,采用反证法,即假设I不是 N的最优解。
(1)构建最优解 I*(N):假设 I 不是 N 的最优解。则必然存在最优解 I*,如果I中没有1,用 1 替代 I中的第一个集装箱标号得到的解也是最优解(个数不变,因此也是最优解),使得 I为N 的最优解,
且|I|>|I|。
(2) 构建最优解 I*’(N’):因为 I为N的最优解,构建的I’=I*-{1}是N不包含 1 的最优解(待证明),即关于 N’、W’、C’的最优解。
证明:I*’=I*-{1}是N不包含 1 的最优解。
证(反证法):如果 I*’=I*-{1}不是不包含 1 的最优解,那么存在最优解 I*’’ ( N’,不含 1),使得|I*’|<|I*’’|,
即|I*’+{1}|<|I*’’ +{1}|,与 I*’+{1}= I为最优矛盾,因此 I’=I*-{1}是不包含 1 的最优解。
(3)构建的最优解 I*’与归纳假设的最优解 I’比较:由(1)|I*|>|I|得,| I*’|= ,与 I’的最优性矛盾(最优解 I*- {1}大于最优解 I’)。
3. 设计
对pw[i]=p[i]/w[i]降序
For i to n //n是物品数量
装入,-w[i],+v[i],x[i]=1
4. 分析
T(n)=O(nlogn)
5. 源码
以上是关于0-1背包问题的主要内容,如果未能解决你的问题,请参考以下文章