问答题
[说明]
某餐厅供应各种标准的营养套餐。假设菜单上共有n项食物m
1
,m
2
,…,m
n
每项食物m
i
的营养价值为v
i
,价格为p
i
,其中i=1,2,…,n,套餐中每项食物至多出现一次。客人常需要一个算法来求解总价格不超过M的营养价值最大的套餐。
问答题
下面是用动态规划策略求解该问题的伪代码,请填充其中的横线处。伪代码中的主要变量说明如下。
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 t0 n
2 nv[i] [0] = 0
3 for j = 1 t0 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] [j] = nv[i-1] [j]
9 else if ______
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 downt0 1
15 if ______
16 x[i]=0
17 else
18 x[i]=1
19 ______
20 return x and nv[n] [M]
【正确答案】
【答案解析】nv[i-1][j]>=nv[i-1]j-p[i]]+v[i]
nv[i][j]==nv[i-1][j]
j=j-p[i]
问答题
现有5项食物,每项食物的营养价值和价格如下表所示。
食物营养价值及价格
|
编码
|
营养价值
|
价格
|
m
1
|
200
|
50
|
m
2
|
180
|
30
|
m
3
|
225
|
45
|
m
4
|
200
|
25
|
m
5
|
50
|
5
|
若要求总价格不超过100元的营养价值最大的套餐,则套餐应包含的食物有______(用食物项的编码表示),对应的最大营养价值为______。
【正确答案】
【答案解析】m
2
,m
3
,m
4
605
问答题
第一小题中伪代码的时间复杂度为______(用O符号表示)。