1. 问题
有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
2. 解析
采用下面的列子(i代表序号,s数组代表活动开始时间,f数组代表活动结束时间)
i 1 2 3 4 5 6 7 8 9 10 11
s[i] 1 3 0 5 3 5 6 8 8 2 12
f[i] 4 5 6 7 8 9 10 11 12 13 14
将其按照结束时间从小到大排序求出最优解有4种
下面给出反例:
将其按照开始时间从小到大排序后
i 3 1 10 2 5 4 6 7 8 9 11
s[i] 0 1 2 3 3 5 5 6 8 8 12
f[i] 6 4 13 5 8 7 9 10 11 12 14
选择3号活动,然后是7号,最后是11号,一共是3种,与最优解4中矛盾,可见按照开始时间的排序方式无法求出最优解
3. 设计
#include<stdio.h>
#define M 11
#define MAX 2000
void select(int num, int s[], int f[]) {
int preStart = 0;
int preFinal = MAX;//保证是无限大即可
int i;
int temp;
int OK = 1;
int sel[M];//用来储存相容的活动编号
int selNum = 0;
while (OK) {
OK = 0;
for (i = 0; i < M; i++) {
if (f[i] < preFinal && s[i] >= preStart) {//寻找开始时间合适地情况下结束时间最早者
preFinal = f[i];
temp = i;
OK = 1;
printf("%d-->%d\n", s[i], f[i]);
}
}
if (preFinal != MAX) { //变量的重新赋值
sel[selNum++] = temp;
preStart = f[temp];
preFinal = MAX;
}
}
}
int main() {
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 };
select(M, s, f);
}
4. 分析
时间复杂度O(n)=m