有限期作业安排问题

问题描述:给定n个作业j,jz,…jn,作业j的期限为d;收益为p,d, p;为非负整数, i=1, 2,n。规定只有在期限d;内完成任务j才能得到收益p;。设只有一台处理机,同时只能处理一个作业,且完成每个作业都需要一个单位时间。问如何安排作业处理顺序使得总收益最大?

贪心选择策略:按收益从高到低的顺序逐个安排作业的处理顺序,在不影响收益高的作业的期限的前提下,尽量让期限早的作业先处理。

算法JOB ARRANGEMENT
输入:作业数n,表示n个作业的期限和收益的数组d和p
输出:最优的作业安排序列J[1..k]和安排的作业数k

//对p[1..n]按降序地址排序,排序结果返回到数组a[1..n]中,使得//p[a[1]]>=p[a[2]]>-...>=p[a[n]],因为两个数组要对应着来算,所以要排数组下标
a=sort(p, n)				//a[0]也是0
d[0]=0; J[0]=0 				//设一个虚拟作业编号为0,期限为0
J[1]=a[1] 					//直接安排收益最高的作业a[1]
k=1 						//k总是表示当前已被安排的作业数
for t=2 to n
	i=a[t] 					//i为当前考虑安排的作业。
	r=k
	while d[J[r]]>d[i] and d[J[r]]>r 
		//当上一次作业期限大于本次的期限,而且目前花费的单位时间r比上次作业期限小
		//于是让期限早的插入到前面作业先做,同时不能让已安排的作业超期
		r = r-1				
	end while
	//在记录操作顺序的数组J上,我们已经通过循环找到了虽比队列J里前一个便宜但可在时间期限内
	//贪心完成的,现在我们要把他们插入进去,r已经变为了要插入位置的前一个下标
	if d[J[r]]<=d[i] and d[i]>r then
		for s=k to r+1 J[s+1]=J[s]			//把i插入到J中的r+1位置上
		J[r+1]=i
		k=k+1
	end if
end for
return k, J[..k]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值