vlambda博客
学习文章列表

刷题时,遇见过哪些巧妙的贪心算法的题目?

算法小白闭眼进,给大家介绍一个有趣的、过程详尽的贪心算法的例子:加勒比海盗船——最优装载问题


刷题时,遇见过哪些巧妙的贪心算法的题目?

在北美洲东南部,有一片神秘的海域,那里 碧海蓝天、阳光明媚 ,正是传说中海盗最活跃的 加勒比海(Caribbean Sea) 。有一天,海盗们截获了一艘装满各种各样古董的货船,每一种古董都价值连城。

虽然海盗船足够大,但载重量为c,每件古董的重量为 刷题时,遇见过哪些巧妙的贪心算法的题目? ,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?


01



问题分析

根据问题描述可知这是一个可以用心算法求解的最优装载问,要求装载的物品的数量尽可能多,而船的容量是固定的,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。


采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解



02



算法设计

(1)当载重量为定值c时, 刷题时,遇见过哪些巧妙的贪心算法的题目?越小,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止,即可。


(2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前 i 个古董,直到不能装为止,此时达到最优。



03



完美图解

假设古董如下图所示:

刷题时,遇见过哪些巧妙的贪心算法的题目?
古董图片
每个古董的重量如表2-1所示,海盗船的载重量c为30,那么在不能打碎古董又不超过载重的情况下,怎么装入最多的古董?

刷题时,遇见过哪些巧妙的贪心算法的题目?


(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名正在免费报名中!


3月23日晚8:00开课
刷题时,遇见过哪些巧妙的贪心算法的题目?

作者:人民邮电出版社
链接:

来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

-END-

刷题时,遇见过哪些巧妙的贪心算法的题目?

Epubit   Welfare

异步福利


邀请好友关注“异步图书”领取纸书1本,立刻填表抢座。



刷题时,遇见过哪些巧妙的贪心算法的题目?




扫码关注「异步图书
聊聊图书背后的故事

回复“进群”入群领新手福利
异步VIP会员、技术分享、学习交流、赠书活动
👇点击阅读原文,免费报名