贪心算法特征:1:贪心选择性质;2:最优子结构:('动态规划'),具体依情况而定。
贪心算法性质: 虽不能对所有问题都能得到整体最优解,但是对于范围较广的许多问题得到其整体最优解。如‘単源最短路径', '最小生成树' 等。贪心算法是对许多整体最优解的近似解。
贪心算法思想:
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。
(算法局限)
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
PS: 可参考 :背包问题可以用贪心算法求解,但0-1背包问题不能用贪心算法求解。
实现该算法的过程:
从问题的某一初始解出发,一直往下走,找出余下的“最优”解。由所有解元素组合成问题的一个可行解。
扫描二维码关注公众号,回复:
1740957 查看本文章
题意:要在足够多的会场里安排一批活动,希望使用最少的会场。
代码:
/** @贪心算法-会场安排 @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 */