zoukankan      html  css  js  c++  java
  • 部分背包问题的贪心算法正确性证明

    一,部分背包问题介绍

    首先介绍下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

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

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/hapjin/p/5575109.html
Copyright © 2011-2022 走看看