问题 问答题

【说明】 某机器上需要处理n个作业.job1,job2,…,jobn,其中:

(1)每个作jobi(1≤i≤n)的编号为i,jobi有一个收益值p[i]和最后期限值d[i]小

(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍; (

3)job1~jobn的收益值呈非递增顺序排列,即p[1)≥P[2]≥…[n);

(4)如果作业jobi在其期限之内完成,则获得收益9[i];如果在其期限之后完成,则没有收益。

为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图4-1是基于贪心策略求解该问题的流程图。

(1)整型数组J[]有n个存储单元,变量k众表示在期限之内完成的作业J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k]里的作业按其最后期限非递减排序,即 d[J[1]]≤…≤d[J[k]]。

(2)为了便于在数组J中加入作业,增加一个虚拟作业Job0,并令d[0]=0,j[0]=0。

(3)算法大致思想:先将作业.job1的编号1放入J[1],然后,依次对每个作业.jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。

jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。

(4)流程图中的主要变量院明如下。 i:循环控制变量,表示作业的编号; k:表示在期限内完成的作业数: r:若.jobi能插入数组J,则其在数组了中的位置为r+1: q:循环控制变量,用于移动数组J中的元素。

对于本题的作业处理问题,用图4-1的贪心算法策略,能否求得最高收益(6)。用贪心算法求解任意给定问题时,是否一定能得到最优解(7)

答案

参考答案:

(6)能,或可以、行及其他含义相同的词语

(7)不能,或不可以、不行及其他含义相同的词语

解析:

[分析]:

本题考查的是算法的设计和分析技术。

问题1考查的是贪心算法的流程图。第(1)空表示第2个作业到第n个作业的主循环,i是循环控制变量,故第(1)空填入i<=n。

应注意到数组/中的作业J[i](1≤i≤k)是在其期限之前完成的作业,且d[J[i]]≤d[J[i+1]] (1≤id[i]。另一方面, J[D[R]]与r的关系只有两种:J[d[r]] >r,表示还可能在J[1]与J[r]之间插入作业i;J[d[r]]=r,表示不可能在J[1]~J[r]之间插入作业i。J[d[r]] 问题2是本题算法的一个实例。6个作业的收益已经按降序排好序。根据流程图,将作业1,2,4和5放入数组J中,并得到总收益为220,具体过程如表4-1所示。

表4-1 算法执行过程

问题3考查算法策略。对于该题,贪心策略可以求得最优解。但不是所有的问题都能通过贪心策略来求得最优解,一个典型的例子是0-1背包问题。举例如下,有三件物品,背包可容纳50磅重的东西,每件物品的详细信息如表4-2所示,问如何装包使得其价值最大

表4-2 物品信息

如果按贪心策略求解该问题,优先选择单位价值最大的物品,则先选择物品1,然后选择物品2。由于此时背包容量还剩下50-10-20=20,不足以容纳物品3,故总价值为 60+100=160美元。但若选择物品2和物品3,容量总和为20+30,小于等于总容量50,得到总价值为100+120=220,会得到更优解。此时用贪心策略不能得到最优解。

单项选择题
单项选择题