单项选择题

斐波那契(Fibonacci)数列可以递归地定义为:


用递归算法求解F(5)时需要执行 (4) 次“+”运算,该方法采用的算法策略是 (5)

A.动态规划
B.分治
C.回溯
D.分支限界
热门 试题

问答题
阅读下列说明,回答问题。 [说明] 某餐厅供应各种标准的营养套餐。假设菜单上共有n项食物m1,m2,...,mn,每项食物mi的营养价值为vi,价格为Pi,其中i=1,2…,n,套餐中每项食物至多出现一次。客人常需要一个算法来求解总价格不超过M营养价值最大的套餐。 [问题1] 下面是用动态规划策略求解该问题的伪代码,请填充其中的空缺(1)、(2)和(3)处。伪代码中的主要变量说明如下。 n:总食物项数。 v:营养价值组,下标从1~n,对应第1到第n页食物的营养价值。 p:价格数组,下标从1~n,对应第1到n项食物的价格。 M:总标准即套餐的价格不超过M。 x:解向量(数组),下标从1~n,其元素值为0或1,其中元素值为0表示对应的食物不出现在套餐中,元素值为1表示对应的食物出现在套餐中。 nv:n+1行M+1列的二维数组,其中行和列的下标均从0开始,nv[i][j]表示由前i项食物组合且价格不超过项j套餐的最大营养价值。问题最终要求的套餐的最大营养价值为nv[n][M]。伪代码如下: MaxNutrientValue(n,v,p,M,x) 1 for i=0 to n 2 nv[i][0]=0 3 for j=1 to M 4 nv[0][j] =0 5 for i=1 to n 6 for j=1 to M 7 if j< p[i] 若食物mi不能加入到套餐中 8 nv[i] [jl =nv[i-1][j] 9 else if (1) 10 nv[i][j] =nv[i-1][j] 11 else 12 nv[i] [j] =nv[i-1][j-p[i]]+v[i] 13 j=M 14 for i=n downto 1 15 if (2) 16 x[i] =0 17 else 18 x[i] =1 19 (3) 20 return x and nv[n] [M] [问题2] 现有5项食物, 每项食物的营养价值和价格如表9.3所示。 表9.3食物营养价值及价格表 编码 营养价值 价格 m1 200 50 m2 180 30 m3 225 45 m4 200 25 m5 50 5 若要求总价格不超过100的营养价值最大的套餐,则套餐应包含的食物有 (4) (用食物项的编码表示),对应的最大营养价值为 (5) 。 [问题3] 问题1中伪代码的时间复杂度为 (6) (用O符号表示)。
问答题
阅读下列说明,回答问题1至问题3。 [说明] 快速排序是一种典型的分治算法。采用快速排序对数组A[P..r]排序的3个步骤如下。 (1)分解:选择一个枢轴(pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..g-1]和A[q+1..],使得A[g]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。 (2)递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。 (3)合并:快速排序在原地排序,故不需合并操作。 [问题1] 下面是快速排序的伪代码,请填补其中的空缺。伪代码中的主要变量说明如下。 A:待排序数组。 p,r:数组元素下标,从p到r。 q:划分的位置。 x:枢轴元素。 i:整型变量,用于描述数组下标。下标小于或等于i的元素的值小于或等于枢轴元素的值。 j:循环控制变量,表示数组元素下标。 QUICKSORT (A,p, r) if (p<r) q = PARTITION(A,p,r); QUICKSORT(A,p,q-1); QUICKSORT (A,q+1,r); PARTITION (A,p,r) x=A[r]; i=p-1; for(j=p;j≤r-1; j++) if(A[j]≤x) i=i+1; 交换A[i]和A[j] 交换 (1) 和 (2) 注:空(1)和空(2)答案可互换,但两空全部答对方可得分 return (3) [问题2] (1)假设要排序包含n个元素的数组,清给出在各种不同的划分情况下,快速排序的时间复杂度,用0记号。最佳情况为 (4) ,平均情况为 (5) ,最坏情况为 (6) 。 (2)假设要排序的n个元素都具有相同值时,快速排序的运行时间复杂度属于哪种情况 (7) 。(最佳、平均、最坏) [问题3] (1)待排序数组是否能被较均匀地划分对快速排序的性能有重要影响,因此枢轴元素的选取非常重要。有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素,下面是随机化快速排序划分的伪代码。利用原有的快速排序的划分操作,请填充其中的空缺处。其中,RANDOM(i j)表示随机取i到j之间的一个数,包括i和j。 RANDOMIZED-PARTITION(A,p,r) i= RANDOM(p,r); 交换 (8) 和 (9) ; 注:空(8)和空(9)答案可互换 return PARTITION(A,p,r); (2)随机化快速排序是否能够消除最坏情况的发生 (10) 。(是或否)