0-1背包问题

Posted 为你花开满城,灯明三千

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-1背包问题相关的知识,希望对你有一定的参考价值。

1. 

 

 

2. 解析

价值密度pi/wi 贪婪算法,这种选择准则为:从剩余物品中选择可装入包的pi/wi值最大的物品。

思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止。

定理:对于任何正整数 k 算法 (轻者先装)对 k 个集装箱的实例得到

最优解。

证明(数学归纳法)

1k=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中的第一个集装箱标号得到的解也是最优解(个数不变,因此也是最优解),使得 IN 的最优解,

|I|>|I|

2) 构建最优解 I*’N’):因为 IN的最优解,构建的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. 源码

https://github.com/2579081436/algorithm.github.io

以上是关于0-1背包问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 算法主题系列之集结0-1背包问题的所有求解方案

动态规划-多重背包问题

背包问题(0-1背包+完全背包)

0-1背包问题 —— 四种解法解题

背包问题之0-1背包

背包0-1背包与完全背包一维数组实现