能否使用贪心算法?替换法证明
小楼同学在昨天的推文中简单介绍了贪心算法。还记得小楼同学举的例子吗?
有一批标明单位体积价格的钻石摆在小楼同学面前,小楼同学只有一个背包可以装钻石,问小楼同学最多能带走价值多少的钻石。
这个问题使用贪心算法,求出的是不是最优解?如果是,又该如何证明?不用着急,请听小楼同学为大家细细道来。
此类问题能否使用贪心算法得到最优解,一个依据是钻石是否可以拆分。(假设切分钻石不影响其单位体积的价格。)
如果钻石不能拆分,贪心算法是得不到最优解的。
我们可以举一个例子,假设只有三颗钻石,其价格和体积构成的数对分别为:
(9,7),(5,5),(5,5)
按照贪心算法,我们得到的结果是选择第一颗钻石。但显然,选择第二颗钻石总价格最高。
类似于这种物品不可分割,背包空间不一定被完全利用的问题,大部分都不能使用贪心算法求出最优解。
如果钻石可以切割,我们可以使用贪心算法,用替换法证明如下:
该问题的最优解序列是存在的,将其按照价格/体积从大到小的顺序重新排列,得到:
序列1:a1,a2...
将用贪心算法计算出的序列按照价格/体积从大到小的顺序排列,得到:
序列2:b1,b2...
假设设序列1与序列2中第一个位置相同但值不同的元素为aj和bj。
因为使用贪心算法,每一步选取的钻石都是剩余钻石中价格/体积最大的,所以aj小于bj。用bj选取的钻石,替代若干体积的aj钻石,会使序列1的总价升高。与序列1是最优解相矛盾。所以假设不成立。
因此我们可以得出结论序列1=序列2。即该问题使用贪心算法求得的是最优解。
贪心算法在数学建模中应用广泛,但不代表任何问题都可以用它求解。小楼同学建议大家,不管是在日常学习还是在数学建模竞赛中,如果打算使用,首先要简单判断一下该问题是否可以使用贪心算法求出最优解。