对“活动安排问题”贪心法的问题

问题遇到的现象和发生背景

看经典题目“活动安排问题”学贪心算法,还是不太清楚一些细节:
如题:
设有n个活动的集合 E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

  每个活动 i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi,且 si < fi。如果选择了活动i,则它在半开时间区间 [si ,fi ) 内占用资源。若区间 [si , fi )与区间 [sj, fj ) 不相交,则称活动i与活动j是相容的。当 si ≥ fj 或 sj ≥ fi 时,活动 i 与活动 j 相容。

  活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。

用代码块功能插入代码,请勿粘贴截图
#include    
 2 using namespace std;   
 3   
 4 #define NUM 50 
 5 
 6 void GreedySelector(int n, int s[], int f[], bool b[])  
 7 {
 8     b[1]=true;  //默认将第一个活动先安排 
 9     int j=1;    //记录最近一次加入b中的活动  
10   
11       //依次检查活动i是否与当前已选择的活动相容
12     for(int i=2;i<=n;i++)  
13     {  
14         if (s[i]>=f[j])  
15         {   
16             b[i]=true;  
17             j=i;  
18         }  
19         else  
20             b[i]=false;  
21     }  
22 }
23 
24 int main()  
25 {  
26     int s[] = {0,1,3,0,5,3,5,6,8,8,2,12};          //存储活动开始时间
27     int f[] = {0,4,5,6,7,8,9,10,11,12,13,14};      //存储活动结束时间
28     bool b[NUM];  //存储被安排的活动编号 
29      int n = (sizeof(s) / sizeof(s[0])) - 1;
30      
31     GreedySelector(n, s, f, b);
32     
33     for(int i = 1; i <= n; i++)      //输出被安排的活动编号和它的开始时间和结束时间 
34     {  
35         if(b[i]) cout << "活动 " << i << " :" << "(" << s[i] << "," << f[i] << ")" <36     }  
37     return 0;  
38 }  

我想要达到的结果

想问一下,为什么可以默认选择第一个活动。如果选择第一个活动会导致后续不合理的选择,那不应该放弃第一个活动吗,如果强行选择第一个活动不会产生错误吗。
希望能解答一下我的问题

贪心算法只能求局部最优解。这个代码只是求得从第一个活动开始情况下的最优解而已

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632