活动安排问题 一个由需要使用某一资源的n个活动组成的集合S = {1, 2, ... , n},该资源一次只能被一个活动占用。每个活动i有个开始时间s[i]和结束时间f[i],且s[i] <= f[i]。一旦被选择,活动i就占据半开时间区间[s[i], f[i])。如果[s[i], f[j])与[s[i], f[j])互不重叠,则称活动i和j是兼容的。活动安排问题就是要选择一个由互相兼容的问题组成的最大集合。 ActivitySelectorMain.c
#include
<
stdio.h
>
void
GreedyActivitySelector(
int
n,
int
*
s,
int
*
f,
int
*
A);
void
PrintActivity(
int
n,
int
*
s,
int
*
f,
int
*
A);
/**/
/* * n:活动个数 * s:活动开始时间 * f:活动结束时间 * 假设输入的活动按结束时间递增序排列:f[1] <= f[2] <= ... <= f[n] * A:记录所选择的集合 */
void
GreedyActivitySelector(
int
n,
int
*
s,
int
*
f,
int
*
A)
...
{ int i, j; A[ 0 ] = 1 ; j = 0 ; for (i = 1 ; i < n; i ++ ) ... { if (s[i] >= f[j]) ... { A[i] = 1 ; j = i; } } }
void
PrintActivity(
int
n,
int
*
s,
int
*
f,
int
*
A)
...
{ int i; for (i = 0 ; i < n; i ++ ) ... { if (A[i]) printf( " %d %d-->%d " , i, s[i], f[i]); } }
int
main(
int
argc,
char
**
argv)
...
{ int s[] = ... { 1 , 3 , 0 , 5 , 3 , 5 , 6 , 8 , 8 , 2 , 12 } ; int f[] = ... { 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 } ; int A[ 11 ] = ... { 0 , } ; int n; n = 11 ; GreedyActivitySelector(n, s, f, A); PrintActivity(n, s, f, A); return 0 ; }