贪心

一:贪心算法

  每一次决策时采用当前意义下的最优策略(个人的理解,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)例题

       LibreOJ种数

     (2)思路

       按照右区间从小到大排序,依次考虑各个活动,如果没有和已经选择的活动冲突,就选,否则就不选择

     (3)伪代码

       LibreOJ-SeanOcean

  2.区间选点问题

     (1)例题

         LibreOJ种数

     (2)思路

       按照右区间从小到大排序,从种植区间从右往左扫描是否达到最少的种植数量,如果没有,从区间向右扫描将没有种植的种上树,达到要求

     (3)伪代码

       LibreOJ-SeanOcean

  3.区间覆盖问题

     (1)例题

         LibreOJ种数

     (2)思路

       按照右区间从小到大排序,从种植区间从右往左扫描是否达到最少的种植数量,如果没有,从区间向右扫描将没有种植的种上树,达到要求。

     (3)伪代码

       LibreOJ-SeanOcean(不知为何有一个点本地过了,OJ上runtime error)

  4.流水作业问题 

     (1)例题

         LibreOJ加工生产调度

     (2)思路

       Johnson算法,将a<b的顺序储存在N1集合,将a>=b逆序储存在N2集合,详细证明(此处~~~)

     (3)伪代码

       LibreOJ-SeanOcean

  5.单位时间任务调度问题

      类似于区间选点问题,只是带了权值而已,千言万语~~~

  6.数列极差问题

     (1)例题

         LibreOJ数列极差

     (2)思路

       把一份数据放入大根堆,每次取两个出来,再将他们两个乘积+1在插入大根堆中,得出的就是最小的,再拷贝一份数据放入小根堆,每次取两个出来,再将他们两个乘积+1在插入小根堆中,得出的就是最大的,输出差即可,

       堆的定义:友情推荐

        priority_queue<int> que1;逆序,大根堆
        priority_queue<int,vector<int>,greater<int> > que2;顺序,小根堆

     (3)伪代码

       LibreOJ-SeanOcean

五:贪心算法上机练习

 未完待续~~~

 

原文地址:https://www.cnblogs.com/SeanOcean/p/10931935.html