问题描述:
每个活动都共享同一个公共的资源(比如教室等)所以同一时间只能有一个活动。现在的问题就是要在指定的时间内让举办的活动数量做大。
这是一个典型的贪心算法。我们不在这里证明算法的正确性。
我们给出贪心算法的定义:它在每一步都作出当时看起来最佳的选择。(它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解)
一般的贪心算法有以下的步骤:
1.确定问题的最优子结构。
2.设计一个递归算法。
3.证明如果我们做出一个贪心选择,则只剩下一个子问题。
4.证明贪心选择总是安全的。(步骤3、4的顺序可以调换)
5.设计一个递归算法实现贪心策略。
6.将递归算法转换为迭代算法。
代码实现如下:
#include <stdio.h>
struct Activty{
int start;
int finish;
};
typedef struct Activty Activty;
struct List{
Activty *value;
struct List *next;
};
typedef struct List List;
//迭代贪心算法
List *GREEDY_ACTIVITY_SELECTOR(Activty action[],int n){
List *rs = (List *)malloc(sizeof(List));
rs->value=action;
List *position = rs;
int k=0,m=1;
for(;m<n;m++){
if(action