贪心策略—活动安排

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值