活动安排问题(贪心算法及证明)

会场安排问题(贪心算法):

贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。



2.相关代码:

#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;
		}
	}
	printf("%d",selNum);//相容数量 
}

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);
}

3.问题解决思路:

把会场要安排的所有活动作为一个集合W,初始开始时间标准为preStart,初始结束时间标准为preFinal.每次放入W的活动要在满足,开始时间s[i]>preStart的前提下f[i]最小。然后把f[i]赋值给preStart. 依次加入,直到加不进去为止。从而把问题解决。

4.为什么贪心算法可以得到最优解?

贪心算法并不是针对任何一个问题都存在最优解,但是针对会场安排问题可以得到最优解。我们可以从贪心算法得到的结果集仅进行倒推。首先去掉结果集中的第一个活动A,那么在剩下的活动中,结束时间最早的活动B的结束时间一定不早于A,那么A活动在最优解中一定合理。再用同样的方式判断活动B,依次类推,则结果集就是最优解。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值