一:贪心算法
每一次决策时采用当前意义下的最优策略(个人的理解,dalao勿喷)
二:贪心算法特点
1.贪心选择
2.最优子结构
三:贪心算法实例
1.最优装载问题
(1)例题
题意:给出n个物体,第i个物体的重量为wi。选择尽量多的物体,使得总重量不超过C。
输入:n和C以及n个整数表示的wi。
输出:按照输入物体的顺序输出n个用空格分隔的Y或N。Y表示该物体被选中,N表示不被选中。 最后一行输出所选中的物体的个数num和总重量w,用空格分隔。 注意:这个地方每个物体是不可再分割的整体。
(2)思路
从最重的开始装,直至装不下为止
2.部分背包问题
思路:
性价比排序处理
3.乘船问题
思路:
大的带小的
四:贪心算法应用
1.不相交区间选择问题
(1)例题
(2)思路
按照右区间从小到大排序,依次考虑各个活动,如果没有和已经选择的活动冲突,就选,否则就不选择
(3)伪代码
2.区间选点问题
(1)例题
(2)思路
按照右区间从小到大排序,从种植区间从右往左扫描是否达到最少的种植数量,如果没有,从区间向右扫描将没有种植的种上树,达到要求。
(3)伪代码
3.区间覆盖问题
(1)例题
(2)思路
按照右区间从小到大排序,从种植区间从右往左扫描是否达到最少的种植数量,如果没有,从区间向右扫描将没有种植的种上树,达到要求。
(3)伪代码
LibreOJ-SeanOcean(不知为何有一个点本地过了,OJ上runtime error)
4.流水作业问题
(1)例题
(2)思路
Johnson算法,将a<b的顺序储存在N1集合,将a>=b逆序储存在N2集合,详细证明(此处~~~)
(3)伪代码
5.单位时间任务调度问题
类似于区间选点问题,只是带了权值而已,千言万语~~~
6.数列极差问题
(1)例题
(2)思路
把一份数据放入大根堆,每次取两个出来,再将他们两个乘积+1在插入大根堆中,得出的就是最小的,再拷贝一份数据放入小根堆,每次取两个出来,再将他们两个乘积+1在插入小根堆中,得出的就是最大的,输出差即可,
堆的定义:友情推荐
priority_queue<int> que1;逆序,大根堆
priority_queue<int,vector<int>,greater<int> > que2;顺序,小根堆
(3)伪代码
五:贪心算法上机练习
未完待续~~~