Loading [MathJax]/jax/output/HTML-CSS/jax.js

部分背包问题的贪心算法正确性证明

简介:

一,部分背包问题介绍

首先介绍下0-1背包问题。假设一共有N件物品,第 i 件物品的价值为 Vi ,重量为Wi,一个小偷有一个最多只能装下重量为W的背包,他希望带走的物品越有价值越好,请问:他应该选择哪些物品?

0-1背包问题的特点是:对于某件(更适合的说法是:某类)物品,要么被带走(选择了它),要么不被带走(没有选择它),不存在只带走一部分的情况。

而部分背包问题则是:可以带走一部分。即,部分背包问题可带走的物品 是可以 无限细分的。(连续与离散的区别)

可以把0-1背包问题中的物品想象的一个金子,你要么把它带走,要么不带走它;而部分背包问题中的物品则是一堆金粉末,可以取任意部分的金粉末

 

二,部分背包问题的贪心算法

部分背包问题可以用贪心算法求解,且能够得到最优解。

贪心策略是什么呢?将物品按单位重量 所具有的价值排序。总是优先选择单位重量下价值最大的物品。

单位重量所具有的价值:Vi / Wi

举个例子:假设背包可容纳50Kg的重量,物品信息如下:

物品 i      重量(Kg)      价值           单位重量的价值

1             10          60                 6

2             20          100               5

3             30          120               4

按照我们的贪心策略,单位重量的价值排序: 物品1 > 物品2 > 物品3

因此,我们尽可能地多拿物品1,直到将物品1拿完之后,才去拿物品2.....

最终贪心选择的结果是这样的:物品1全部拿完,物品2也全部拿完,物品3拿走10Kg(只拿走了物品3的一部分!!!)

这种选择获得的价值是最大的。在(三)会给出证明。

而对于0-1背包问题,如果也按“优先选择单位重量下价值最大的物品”这个贪心策略,那么,在拿了物品1和物品2之后,就不能在拿物品3了。因为,在拿了物品1和物品2之后,背包中已经装了10+20=30Kg的物品了,已经装不下物品3了(50-30 < 30)(0-1背包:一件物品要么拿,要么不拿,否能只拿一部分),此时得到的总价值是 160。而如果拿物品2和物品3,得到的价值为220。这说明,该贪心策略对0-1背包问题,不能求得最优解。

 

三,部分背包问题的贪心策略的正确性证明

贪心策略是:总是优先选择单位重量下价值最大的物品

正确性证明 是:使用该贪心策略,可以获得最优解。在这里,最优解就是带走的物品价值最大。

证明思路:先考察一个全局最优解,然后对该解加以修改(一般是采用“剪枝”技巧),使其采用贪心选择,这个选择将原问题变成一个相似的、但是更小的问题。

先假设 物品集合S={W1,W2....Wn}已经按 单位重量价值从小到大排好序了。

并假设 一个全局最优解是:S(i)={Wi1,Wi2,.....Win}。Wi1,Wi2,.....Win是有序的。对于贪心选择而言,总是会优先 选择 Wn 的物品,当Wn 没有后,再选择Wn-1 .....

如果Win = Wn 问题已经得证。因为,我们的最优解S(i)中,已经包含了贪心选择。只要继续归纳下去,Wi(n-1) 就是 Wn-1 ....

如果Win != Wn 运用剪枝技巧,剪掉Win 并 贴上 W此时,得到的是一个更优的解(因为价值更大了 ,Wn > Win)。因为,Wn 是单位重量价值最高的那个物品啊,我们的贪心选择应该选择它,但是这里的最优解S(i)却没有选择它,于是我们用剪枝技巧,将它加入到S(i)中去,并把S(i)中的Win除去。  

这就证明了,如果用贪心策略来进行选择,得到的是最优解。从而证明了贪心算法的正确性。

其实,也就是证明了一定存在一个最优解,这个最优解就是由贪心选择组成的。

 

四,参考资料

 从 活动选择问题 看动态规划和贪心算法的区别与联系 文章中讲到的 “活动选择问题”的贪心策略的正确性证明。二者证明思路基本一致。

http://www.cnblogs.com/hapjin/p/5573419.html

 

某种 找换硬币问题的贪心算法的正确性证明


本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5575109.html,如需转载请自行联系原作者

相关文章
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
57 5
|
5月前
|
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
180 2
动态规划算法学习三:0-1背包问题
【洛谷 P2240】【深基12.例1】部分背包问题 题解(贪心算法)
**深基12.例1**是部分背包问题,N堆金币,每堆(mi,vi)T承重限制。按金币单价降序装包,保证价值最大化。输入N,T及每堆金币详情,输出两位小数的最大价值。示例:输入4,50,输出240.00。AC代码使用C++,通过排序和迭代实现。
94 0
|
5月前
|
算法之背包问题
本文讨论了可分背包问题和0-1背包问题的区别及解决方法,其中可分背包问题可以使用贪心算法解决,而0-1背包问题则通常采用动态规划方法来找到最大价值的解决方案。
63 0
算法之背包问题
【算法】DP背包问题(C/C++)
【算法】DP背包问题(C/C++)
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
贪心算法-分数背包问题(Python实现)
贪心算法-分数背包问题(Python实现)
137 0
|
10月前
|
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
Java数据结构与算法:动态规划之背包问题
Java数据结构与算法:动态规划之背包问题
|
10月前
|
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
70 0
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等