今天看卢开澄老师老师的算法设计与分析,看到“有期限的任务安排”,感觉书中算法的描述有点晦涩,可能还有一处小错误:
S3. 若b(r(s))>=b(i),则转S4;否则,转S6
个人感觉,“否则,转S5(后移任务列表中的任务,插入任务i)”
贴上算法实现:
/* 贪心算法 有期限的任务安排 */ #include <stdio.h> #include <stdlib.h> //任务数 #define N 7 //任务期限,任务按利润排列 int b[] = {0,5,4,2,1,3,5,6}; //任务的利润 int c[] = {0,70,60,50,40,30,20,10}; //保存最优安排的任务 int r[N+1]; //返回最佳任务数 int greedyTask() { int k,i,s,l; //初始化 b[0]=0;r[0]=0;r[1]=1;k=1;i=2; while(i<=N){ s=k;//s: 访问最佳任务列表, k:记录已安排的任务数 /*如果任务i的期限比安排任务列表中当前任务紧急, b[r[s]]>=b[i] *并且已安排任务列表中还未遇到最大期限的任务, b[r[s]]!=s *则继续在已安排任务列表中前移, s-=1 */ while(b[r[s]]>=b[i]&&b[r[s]]!=s)s-=1; //b[r[s]]<b[i] if(b[r[s]]<b[i]){//任务i的期限没有安排任务列表中当前任务紧急 l=k; while(l>s){//r[s+1…k]依次后移 r[l+1]=r[l]; l-=1; } r[s+1]=i;//添加任务i k+=1;//最佳任务数+1 } //b[r[s]]==s, b[i]<=b[r[s]] /*如果b[r[s]]>=b[i](很显然, if前的while循环由于b[r[s]]==s结束), *说明b[r[s]]==s, r[s]任务已经达到期限, 因此任务i不适合插入, *删除任务i */ i+=1; } return k; }
如有错误,请指正,谢谢!