贪心算法特征: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
*/