贪心算法的一般步骤

一、基本思想

在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

二、求解步骤

  1. 建立数学模型来描述问题;

  2. 把求解的问题分成若干个子问题;

  3. 对每一子问题求解,得到子问题的局部最优解;

  4. 把子问题的解局部最优解合成原来解问题的一个解

三、实例

贪心算法的一般步骤_第1张图片

这里解释下这个表, s [ i ]存储活动开始时间,f [ i ]存储活动结束时间,b[ i ]表示最终安排的结果,选择第1,4,8,11活动

#include 
using namespace std;

#define NUM 50

void GreedySelector(int n, int s[], int f[], bool b[])
{
    b[1]=true;  //默认将第一个活动先安排
    int j=1;    //记录最近一次加入b中的活动

      //依次检查活动i是否与当前已选择的活动相容
    for(int i=2;i<=n;i++)
    {
        if (s[i]>=f[j])//判断后一个活动是否与前一个活动的时间匹配
        {
            b[i]=true;//安排i号
            j=i;
        }
        else
            b[i]=false; //不安排i号
    }
}

int main()
{
    int s[] = {0,1,3,0,5,3,5,6,8,8,2,12};          //存储活动开始时间
    int f[] = {0,4,5,6,7,8,9,10,11,12,13,14};      //存储活动结束时间
    bool b[NUM];  //存储被安排的活动编号
     int n = (sizeof(s) / sizeof(s[0])) - 1;

    GreedySelector(n, s, f, b);

    for(int i = 1; i <= n; i++)      //输出被安排的活动编号和它的开始时间和结束时间
    {
        if(b[i]) cout << "活动 " << i << " :" << "(" << s[i] << "," << f[i] << ")" <

贪心算法的一般步骤_第2张图片

参考:

https://www.cnblogs.com/cao-lei/p/6896841.html

https://blog.csdn.net/weixin_44372699/article/details/90384360

 

你可能感兴趣的:(LeetCode)