问题描述:有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语言数据下标):
所有代码均经过测试,结果正确!