14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~

课前小故事

目录

课前小故事

一、什么是贪心算法?

1.5算法实现

二、实例分析

二、问题分析

3.1、数据结构定义

3.2、按重量排序

3.3、按照贪心策略找最优解

四、代码实战

4.3、欲知后事如何?请看下节解

从前,有一个很穷的人救了一条蛇的命,蛇为了报答他的救命之恩,于是就让这个人提
出要求,满足他的愿望。这个人一开始只要求简单的衣食,蛇都满足了他的愿望,后来慢慢
的贪欲生起,要求做官,蛇也满足了他。这个人直到做了宰相还不满足,还要求做皇帝。蛇
此时终于明白了,人的贪心是永无止境的,于是一口就把这个人吞掉了。所以,蛇吞掉的是宰相,而不是大象。故此,留下了“人心不足蛇吞相”的典故。

一、什么是贪心算法?

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯

1.1贪心本质
一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择 一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。 从而得到全局最优的解决方案.
                                                                                                   《算法导论》 “算法导论”

1.2、贪心算法的基本思路

  • 建立数学模型来描述问题
  • 把求解的问题分成若干个子问题
  • 对每个子问题求解,得到子问题的局部最优解
  • 把子问题的解局部最优解合成原来问题的一个解

1.3、该算法存在的问题

  • 不能保证求得的最后解是最佳的
  • 不能用来求最大值或最小值的问题
  • 只能求满足某些约束条件的可行解的范围

1.4贪婪法的基本步骤:

步骤1:从某个初始解出发;
步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模;
步骤3:将所有解综合起来。

1.5算法实现

  1. 从问题的某个初始解出发。
  2. 采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。
  3. 将所有部分解综合起来,得到问题的最终解。

二、实例分析

2.1问题描述
在北美洲南部,有一篇神秘的海域,那里碧海蓝天、阳光明媚。这正是传说中海盗最活跃的加勒比海。17世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国皇家舰…
有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值,虽然海盗船足够大,但载重量为C,没见古董的重量为wi,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?

三、问题分析

根据问题描述可知这是一个可以用贪心算法求解的最优装载问题,要求装载的物品的数量尽可能多,而船的容量是固定的,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。

3.1算法设计

(1)当载重量为定值C时,wi越小时,可装载的古董数量n越大。只要依次选择最小重量的古董,直到不能再装为止;
(2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前i个古董,直到不能继续装为止,此时达到最优;

例如:

古董的重量清单

根据重量排完序的重量

按照贪心策略,每次选择重量最小的古董放入(mp代表古董的重量,ans 代表已装裁的古董个数。
i=0, 选择排序后的第1个,装入重量tmp=2, 不超过载重量30, ans=1。
i=l,选择排序后的第2个,装入重量tmp -2+3=5,不超过载重量30, ans =2。
i=2,选择排序后的第3个,装入重量tmp= -5+4-9,不超过载重量30,ans =3。
i=3, 选择排序后的第4个,装入重量tmp= -9+5=14, 不超过载重量30,ans =4。
i=4, 选择排序后的第5个,装入重量tmp-14+7=21, 不超过载重量30, ans =5。
i=5,选择排序后的第6个,装入重量tmp=21+10-31,超过载重量30,算法结束。
即放入古董的个数为ans=5个。

三、代码设计

3.2、数据结构定义

根据算法设计描述,我们用一维数组存储古董的重量:

double w[N];  //一维数组存储古董的重量

3.3、按重量排序

可以利用C++中的排序函数sort,对古董的重量进行从小到大(非递减)排序。要使用此函数需引入头文件:

#include <algorithm>sort(begin, end)  //参数begin和end表示一个范围,分别为待排序数组的首地址和尾地址
//sort 函数默认为升序

在本例中只需要调用sort 函数对古董的重量进行从小到大排序:

sort(w, w+n);  //按古董重量升序排序

3.4、按照贪心策略找最优解

首先用变量ans记录已经装载的古董个数,tmp代表装载到船上的古董的重量,两个变量都初始化为0。然后按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量C,则令

ans++;否则,退出。

代码如下;

//tmp 代表装载到船上的古董的重量,ans 记录已经装载的古董个数
int tmp = 0, ans = 0;
for(int i=0; i<n; i++)
{tmp += w[i];if(tmp<=c)ans++;elsebreak;
}

四、代码实战

例如:

#include <iostream>
#include <algorithm>
const int N = 1000005;
using namespace std;
double w[N];  //古董的重量数组
int main()
{double c;int n;cout<<"请输入载重量C及古董个数n:"<<endl;cin>>c>>n;cout<<"请输入每个古董的重量,用空格分开:"<<endl;for(int i=0; i<n; i++){cin>>w[i];  //输入每个物品重量}sort(w,w+n);//tmp 代表装载到船上的古董的重量,ans 记录已经装载的古董个数double tmp = 0.0;int ans = 0;for(int i=0; i<n; i++){tmp+=w[i];if(tmp<=c)ans++;elsebreak;}cout<<"能装入的古董最大数量为ans=";cout<<ans<<endl;return 0;
}

4.1、算法解析及优化拓展
1.算法复杂度分析
(1)时间复杂度:首先需要按古董重量排序,调用sort函数,其平均时间复杂度为O(nlogn),
输入和贪心策略求解的两个for语句时间复杂度均为O(m),因此时间复杂度为0(n + nlog())。
(2)空间复杂度:程序中变量tmp,ans等占用了一些辅助空间,这些助空间都是常数阶的,因此空复杂度为O(1)。
4.2、优化拓展
(1)这一个问题为什么在没有装满的情况下,仍然是最优解?算法要求装入最多数量,
假如c为5, 4个物品重量分别为1、3、5、7.排序后,可以装入1和3,最多装入两个。
分析发现是最优的,如果装大的物品,最多装一个或 者装不下,所以选最小的先装才能装入
最多的数量,得到解是最优的。

4.3、欲知后事如何?请看下节解析

在伪代码详解的第3步“按照贪心策略找最优解”,如果把代码替换成下面代码,
有什么不同?
首先用变量ans记录已经装载的古董个数,初始化为m; tmp 代表装载到船上的古董的
重量,初始化为0。然后按照重量从小到大排序,依次检查每个古董,tmp 加上该古董的重
量,如果tmp大于等于载重量c,则判断是否正好等于载重量c,并令ans=i+1;否则ans=i,
退出。如果tmp小于载重量e,i++, 继续下一个循环。

贪心算法之贪心的加勒比海盗相关推荐

  1. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

  2. 田忌赛马贪心算法_贪心算法之田忌赛马

    你一定听过田忌赛马的故事吧?       如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  3. java 贪心算法思路,贪心算法之——黑白点的匹配(两种实现方法),贪心算法...

    贪心算法之--黑白点的匹配(两种实现方法),贪心算法 一.题目 设平面上分布着n个白点和n个黑点,每个点用一对坐标(x, y)表示.一个黑点b=(xb,yb)支配一个白点w=(xw, yw)当且仅当x ...

  4. 贪心算法之贪心的c小加问题

    NYOJ-236 心急的C小加 心急的C小加 时间限制: 1000 ms  |           内存限制: 65535 KB 难度: 4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一 ...

  5. 田忌赛马贪心算法_贪心算法--田忌赛马问题

    题目描述: 你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  6. 贪心算法(各种贪心题目)

    感觉很多贪心的题目只要想到怎么贪心就很快能解决,但是没有想到的话代码量就会很大,而且很容易出错,所有贪心还是要多做题目,掌握各种贪心的题目 题目链接:https://vjudge.net/contes ...

  7. java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)

    部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...

  8. 田忌赛马贪心算法_贪心算法解决田忌赛马

    田忌赛马--对策问题 教学目标: 1.通过简单的事例,使学生初步体会对策论在解决... 梁锦美有无课件 上课时间 有 12 月 15 日 1 田忌赛马中的数学问题 课时... 同学们,你听过" ...

  9. php自动排课贪心算法,关于贪心法的排课算法.pdf

    25 3 V o . 25 No. 3 2005 5 J ourna of Y unnan Norm a Universit y M ay 2005 * 梁 立, 陈玉华, 徐 敏 ( , 65009 ...

最新文章

  1. Rsync数据同步服务
  2. 算法一:求两个数的和
  3. 怎样把做好的css样式改日期,Win8操作系统任务栏中日期样式怎么更改
  4. George and Job(动态规划)
  5. python数据分析系列教程——Pandas全解
  6. 购买二手房时 众多购房者忽视办理土地证过户
  7. 大量精品国学论文免费下载
  8. Linux RT-PREEMPT的softirq机制
  9. Java 桌球小游戏
  10. 机器学习基础(六)贝叶斯统计
  11. 基于微信支付、退款的一个取消预约的方案
  12. jira是干什么_Jira 概述 | 产品、项目和托管 | Atlassian
  13. kafka tool 2.1连接kerberos的kafka(cdh6.3.2)集群。
  14. AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 6 日)
  15. db2 ? 22018
  16. java导出excel合并单元格_Java 导出Excel 合并Excel单元格
  17. Linux搭建MQTT服务器(Mosquitto)
  18. 微信公众号发送小程序卡片_如何在微信 [[公众号]]添加小程序卡片
  19. [转]在.NET CF2.0中调用DirectShow来处理视音频数据
  20. 用番茄工作法提升工作效率 (四)ToDoList的持续优化

热门文章

  1. 计算机关机键桌面,如何在电脑桌面添加一个关机图标?
  2. MySQL数据库忽略大小写
  3. warning:iteration 7 invokes undefined behavior
  4. 从头开始,彻底理解服务端渲染原理
  5. 一般的计算机辐射有危害吗,电脑辐射有什么危害怎么防止 电脑辐射的范围是多少...
  6. 7. Components
  7. 基于Python个人博客系统设计与实现 开题报告
  8. C++ 语言禁止派生类 - final specifier
  9. 史上最好最全最牛的安全驾驶经验(不看必后悔)
  10. Google的几个特别搜索功能(转)