问题描述:给定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]