0-1背包的贪心算法
Posted
技术标签:
【中文标题】0-1背包的贪心算法【英文标题】:Greedy algorithm for 0-1 Knapsack 【发布时间】:2013-03-12 17:04:17 【问题描述】:是否有任何贪心算法可以为非分数(0-1 背包)背包问题提供最佳解决方案?我知道有一个分数版本的背包可以提供最佳解决方案。
【问题讨论】:
不存在(可能)不是。我说可能是因为有无数种方法可以贪婪地解决它(考虑到你可以通过任何可能的函数来订购 2 个参数(重量和成本))。我所知道的最好的贪婪 0-1 背包算法可以保证让你在最优值的 50% 以内。如果它们的权重或值都相同,则贪心会给出最优值。 @Dukeling:您能否提供一个链接或描述您提到的贪心算法(保证 50% 的最优性)? 我在the Stanford Coursera free online course 看到了 50% 最优贪心解法。 Here 的视频由同一位讲师呈现(参见19. APPROXIMATION ALGORITHMS
)。 Here 好像是同一篇文章。
@Dukeling:谢谢,帮了大忙!
由于 0/1 背包是 NP 难的,任何解决该问题的 多项式时间 贪心算法都将证明 P = NP。因此,任何贪心算法都必须在伪多项式或指数时间内运行。
【参考方案1】:
没有贪心算法适用于 0-1 背包,即使贪心算法适用于分数背包。
这是因为在 0-1 背包中,您要么带走 所有 物品,要么根本不带走该物品,不像在分数背包中,您可以只带一部分物品,如果你的包溢出来了。这很关键。
这是一个证明贪婪算法适用于 0-1 背包的示例。假设你有一个 6 号的包和这些物品:
商品 价值 尺寸 价值/尺寸 A 5.5 4 1.38 B 4 3 1.33 C 4 3 1.33
对于 0-1 背包,如果你试图贪婪,你总是会拿价值/尺寸最高的物品,即物品 A。拿了物品 A 后,你只有空间容纳尺寸为 2 或少,所以你将无法拿起其他任何东西。这意味着您的包里只有物品 A,总价值为 22。
另一方面,如果你没有贪心并拿走了最有价值的物品,而是拿走了物品 B,那么你也有足够的空间拿走物品 C。这将导致袋子中的总价值为 24,这比贪婪路线要好。
【讨论】:
以上是关于0-1背包的贪心算法的主要内容,如果未能解决你的问题,请参考以下文章
算法导论贪心算法—排队等待问题单位时间的调度问题0-1背包贪心近似多机调度问题
背包问题基于matlab带权重的贪心萤火虫算法求解0-1背包问题含Matlab源码 045期