贪心算法-会场安排问题

贪心算法特征:1:贪心选择性质;2:最优子结构:('动态规划'),具体依情况而定。

贪心算法性质:  虽不能对所有问题都能得到整体最优解,但是对于范围较广的许多问题得到其整体最优解。如‘単源最短路径', '最小生成树' 等。贪心算法是对许多整体最优解的近似解。

贪心算法思想:

从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。

(算法局限) 

1. 不能保证求得的最后解是最佳的;

2. 不能用来求最大或最小解问题;

3. 只能求满足某些约束条件的可行解的范围。

PS: 可参考 :背包问题可以用贪心算法求解,但0-1背包问题不能用贪心算法求解。

实现该算法的过程:

从问题的某一初始解出发,一直往下走,找出余下的“最优”解。由所有解元素组合成问题的一个可行解。

 题意:要在足够多的会场里安排一批活动,希望使用最少的会场。

代码:

/**
   @贪心算法-会场安排
   @author 狂热的coder
*/
#include<iostream>
#include<algorithm>
#define  MAX_NUM 50
using namespace std;
typedef struct tnode{
      int start;    //起始时间
      int end;     //结束时间
}tnode,Tnode[MAX_NUM];
bool cmp(tnode a,tnode b){   //对活动结束时间进行排序
     return a.end<b.end;
}
int MinArrange(int n){
     Tnode t;
     for(int i = 0;i<n;i++){
         cin>>t[i].start>>t[i].end;
     }
     sort(t,t+n,cmp);
     int count = 1;
     int item = t[0].end;       //排序后第一个计入总规划中
     for(int i = 1;i<n;i++){
        if(t[i].start>=item){  //找出在活动结束后的最小起始时间的下一活动·
            item = t[i].end;
            count++;
        }else{
            ;
        }
     }
     return count;
}
int main(){
    int n;
    cin>>n;
    cout<<"使用最少会场数为:"<<MinArrange(n);
    return 0;
}
/*
5
1 23
12 28
25 35
27 80
36 50
*/

猜你喜欢

转载自blog.csdn.net/lfb637/article/details/80494937