目录
贪心算法应用条件
常见贪心问题
活动安排问题(区间调度问题)
区间覆盖问题
最优装载问题1
最优装载问题2
多机调度问题
例题:翻硬币
例题:快乐司机
例题:防御力
例题:答疑
贪心算法应用条件
1.贪心选择性质:贪心选择性质是指通过局部最优的选择,可以构造出全局最优解。换句话说,一个问题的最优解可以通过一系列局部最优解的选择得到,这些局部最优解最终叠加起来形成全局最优解,贪心算法的每一步都遵循贪心选择性质,即每一步都做出当前看起来最优的选择。
2.最优子结构:最优子结构是指问题的最优解包含子问题的最优解,这意味着可以通过组合子问题的最优解来构造原问题的最优解,动态规划算法依赖于最优子结构性质,但贪心算法也可以利用这一点,尤其是在子问题相互独立的情况下。
3.无后效性:无后效性是指一个问题的状态一旦确定,就不受这个状态之前决策的影响。在贪心算法中,这意味一旦做出选择,这个选择就不会影响未来步骤中的选择,无后效性保证了贪心算法的每一步都是独立的,可以单独考虑,而不需要考虑之前的步骤。
常见贪心问题
活动安排问题(区间调度问题)
有很多电视节目,给出他们的起止时间,有些节目时间冲突。问能完整看完的电视节目最多有多少
解题的关键在于选择什么贪心策略,才能安排尽可能多的活动。由于活动有开始时间和终止时间,一个尽快终止的活动,可以容纳更多的后续活动,所以这个贪心策略为按照最早结束时间排序。
区间覆盖问题
给定一个长度为n的区间,再给出m条线段的左端点和右端点。问最少用多少条线段可以将整个空间完全覆盖
贪心策略:尽量找出更长的线段。把每条线段按照左端点递增排序,设已经覆盖的区间是[L,R],在剩下的线段中,找所有左端点小于等于R,且右端点最大的线段,把这个线段加入到已覆盖区间里,并更新已覆盖区间的[L,R]值。重复该步骤,直到区间全部覆盖。
最优装载问题1
有n种药水,体积都是V,浓度不同。把它们混合起来,得到浓度不大于w%的药水,问怎们混合,才能得到最大体积的药水?注意一种药水要么全用,要么都不用,不能只取一部分。
贪心策略:尽量找浓度小的药水。先对药水按浓度从小到大排序,药水的浓度不大于w%就加入,如果药水的浓度大于w%,计算混合后总浓度,不大于w%就加入,否则结束判断。
最优装载问题2
有n种药水,体积不同,浓度不同。把它们混合起来,得到浓度不大于w%的药水,问怎么混合,才能得到最大体积的药水?注意一种药水可以只取一部分。
贪心策略:尽量找浓度小的药水。先对药水浓度从小到大排序,药水的浓度不大于w%就加入,如果药水的浓度大于w%,计算混合后总浓度,不大于w%就加入,加不完可以加一部分,否则结束判断。
多机调度问题
有n个独立的作业,由m台相同的机器进行加工。作业i的处理时间为ti,每个作业可在任何一台机器上加工处理,但不能间断、拆分。要求给出一种作业调度方案,在尽可能短的时间内,由m台机器加工处理完成这n个作业。
贪心策略:最长处理时间的作业优先,即把处理时间最长的作业分配给最先空闲的机器。让处理时间长的作业得到优先处理,从而在整体上获得尽可能短的处理时间。
例题:翻硬币
针对这个题目,可以一次一次尝试,发现有解的条件,初始字符串s和目标字符串t必定有偶数个字符不同。贪心操作,从头开始遍历字符串,遇到不同的字符就翻动,直到最后一个字符。
例题:快乐司机
针对这个题目,可以思考题目中有的数据怎么样排序能够得到最优的答案,可以发现,按照单价从大到小排序可以得到最优的答案。
例题:防御力
针对这个题目,也是分析题目中拥有的数据的各种排序,发现只增加A或B与道具的顺序没有关系。交替增加A和B,发现A使得B增加快,越大的A对B越有利,A的道具从小打到,后面更大的A更有利于B。B使A增加慢,B的道具从大到小,前面更大的B对A影响小。
例题:答疑
对这个题目进行分析,对题目中的数据进行排序可以发现,当按照每个人三者的总时间和从小到大的顺序排序时得到的为最优解。