问题描述:有N个活动,活动i的开始时间为Si,结束时间为fi。那么如何在N个活动之间,找出活动时间不冲突的活动组合呢?

原理参考《算法导论》。

代码如下:

常规的activity_selector函数

int activity_selector(int *s, int *f, int i, int n) {
    int m = i + 1;
    while (i != -1 && m < n && s[m] < f[i]) //找到兼容的活动m
        m++;
    if (m < n) {
        printf("a%d ", m);
        return activity_selector(s, f, m, n);
    }
    else 
        return 0;
}

贪心下的greedy_activity_selector函数

void greedy_activity_selector(int *s, int *f, int n) {
    for (int m = 0, i = -1; m < n; m++) {
        if (i == -1 || s[m] >= f[i]) {
            printf("a%d ", m);
            i = m;//贪心
        }
    }
}

数据录入

    int s[] = { 1,3,0,5,3,5,6,8,8,2,12 }, f[] = { 4,5,6,7,8,9,10,11,12,13,14 };//s是活动起始时间,f是活动结束时间

Main函数

int main()
{
    int s[] = { 1,3,0,5,3,5,6,8,8,2,12 }, f[] = { 4,5,6,7,8,9,10,11,12,13,14 };//s是活动起始时间,f是活动结束时间
    activity_selector(s, f, -1, LENGTH(s));
    printf("\n贪心算法....\n");
    greedy_activity_selector(s, f, LENGTH(s));
    return 0;
}

测试结果图(老规矩,转换为了C语言数据下标):

 

所有代码均经过测试,结果正确!

 

posted on 2018-06-11 14:06  dalgleish  阅读(301)  评论(0编辑  收藏  举报