贪心算法

Posted blue-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法相关的知识,希望对你有一定的参考价值。

Date:2019-07-22 19:33:09

总是选择当前最优的策略,来获得全局最优的解

Sample:

 1 /*--------------------------区间贪心------------------------*/
 2 /*
 3 问题:区间不相交问题
 4 问题描述:
 5     给出N个开区间(x,y),从中选择尽可能多的开区间,使其两两之间没有交集
 6     如(1,3),(4,5),(6,7)
 7 贪心解法:
 8     若I1被I2包含,则选择I1
 9     总是先选择右端点最小,或左端点最大的区间
10 */
11 
12 #include <stdio.h>
13 #include <algorithm>
14 
15 using namespace std;
16 
17 const int maxn = 110;
18 
19 struct Inteval
20 
21     int x, y;
22 I[maxn];
23 
24 bool cmp(Inteval a, Inteval b)
25 
26     if(a.x != b.x)
27     
28         return a.x > b.x;    //按左端点由大到小排序
29     
30     else
31     
32         return a.y < b.y;    //左端点相同。则按照右端点从小到大排序
33     
34 
35 
36 int main(void)
37 
38     int n;
39     while(scanf("%d", &n), n!=0)
40     
41         for(int i=0; i<n; i++)
42         
43             scanf("%d %d", &I[i].x, &I[i].y);
44         
45 
46         sort(I, I+n, cmp);
47 
48         int ans = 1;            //ans记录区间不相交的个数
49         int last_x = I[0].x;    //last_x记录上一个被选中区间的左端点
50         for(int i=1; i<n; i++)
51         
52             //if(I[i].y < last_x) 则为区间选点问题
53             if(I[i].y <= last_x)    //该区间右端点在last_x左边
54             
55                 last_x = I[i].x;
56                 ans++;
57             
58         
59         printf("%d\n", ans);
60     
61 
62     return 0;
63 
64 

 

以上是关于贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

程序员算法基础——贪心算法

贪心思想

算法基础--贪心算法

贪心算法学习,附由贪心算法引发的人生感悟。

算法贪心算法(0-1背包问题)

python常用算法——贪心算法,欧几里得算法