刷题时,遇见过哪些巧妙的贪心算法的题目?
算法小白闭眼进,给大家介绍一个有趣的、过程详尽的贪心算法的例子:加勒比海盗船——最优装载问题。
01
问题分析
根据问题描述可知这是一个可以用贪心算法求解的最优装载问题,要求装载的物品的数量尽可能多,而船的容量是固定的,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。
采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。
02
算法设计
(1)当载重量为定值c时, 越小,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止,即可。
(2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前 i 个古董,直到不能装为止,此时达到最优。
03
完美图解
假设古董如下图所示:
(1)因为贪心策略是每次选择重量最小的古董装入海盗船,因此可以按照古董重量非递减排序,排序后如表2-2所示。
(2)按照贪心策略,每次选择重量最小的古董放入(tmp代表古董的重量,ans代表已装载的古董个数)。
04
完伪代码详解
(1)数据结构定义
根据算法设计描述,我们用一维数组存储古董的重量:
(2)按重量排序
可以利用C++中的排序函数sort,对古董的重量进行从小到大(非递减)排序。因此,要使用此函数需引入头文件:
(3)按照贪心策略找最优解
首先用变量ans记录已经装载的古董个数,tmp代表装载到船上的古董的重量,两个变量都初始化为0。然后按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量c,则另ans++;否则,退出。
05
实战演练
▌ 算法实现和测试
(1)运行环境
Code::Blocks
(2)输入
(3)输出
▌ 算法解析及优化拓展
01、算法复杂度分析
02、优化拓展
陈老师近期又为大家送福利了,金三银四:算法春招面试专场公开课,前200名正在免费报名中!
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Epubit Welfare
异步福利
邀请好友关注“异步图书”领取纸书1本,立刻填表抢座。