vlambda博客
学习文章列表

能否使用贪心算法?替换法证明

点击上方“蓝字”关注我们
能否使用贪心算法?替换法证明
01
如何带走最多的钻石



能否使用贪心算法?替换法证明

    小楼同学在昨天的推文中简单介绍了贪心算法。还记得小楼同学举的例子吗?

    

    有一批标明单位体积价格的钻石摆在小楼同学面前,小楼同学只有一个背包可以装钻石,问小楼同学最多能带走价值多少的钻石。


    这个问题使用贪心算法,求出的是不是最优解?如果是,又该如何证明?不用着急,请听小楼同学为大家细细道来。

02
分情况讨论



能否使用贪心算法?替换法证明

    此类问题能否使用贪心算法得到最优解,一个依据是钻石是否可以拆分。(假设切分钻石不影响其单位体积的价格。)


01
不能拆分

    如果钻石不能拆分,贪心算法是得不到最优解的。


    我们可以举一个例子,假设只有三颗钻石,其价格和体积构成的数对分别为:


    (9,7),(5,5),(5,5)


    按照贪心算法,我们得到的结果是选择第一颗钻石。但显然,选择第二颗钻石总价格最高。


    类似于这种物品不可分割,背包空间不一定被完全利用的问题,大部分都不能使用贪心算法求出最优解。


02
可以拆分

    如果钻石可以切割,我们可以使用贪心算法,用替换法证明如下:

    

    该问题的最优解序列是存在的,将其按照价格/体积从大到小的顺序重新排列,得到:

序列1:a1,a2...


    将用贪心算法计算出的序列按照价格/体积从大到小的顺序排列,得到:

序列2:b1,b2...


    假设设序列1与序列2中第一个位置相同但值不同的元素为aj和bj。


    因为使用贪心算法,每一步选取的钻石都是剩余钻石中价格/体积最大的,所以aj小于bj。用bj选取的钻石,替代若干体积的aj钻石,会使序列1的总价升高。与序列1是最优解相矛盾。所以假设不成立。


    因此我们可以得出结论序列1=序列2。即该问题使用贪心算法求得的是最优解。

03
结语


    贪心算法在数学建模中应用广泛,但不代表任何问题都可以用它求解。小楼同学建议大家,不管是在日常学习还是在数学建模竞赛中,如果打算使用,首先要简单判断一下该问题是否可以使用贪心算法求出最优解。

你点的每个赞,我都认真当成了喜欢