问答题 [说明]
某餐厅供应各种标准的营养套餐。假设菜单上共有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符号表示)。
【正确答案】
【答案解析】O(n×M)