第 13 题
答案与解析
第(1)小题
25,35,30,5
货物必须连续选取,而且各件重量均为正数。固定最后一件货物后,向左多包含一件就会增加总重量,因此只需找出以每个位置结尾、总重量不超过 100 的最长连续组合。
| 最后一件的位置(从 1 开始) | 对应的最大载重组合 | 总重量 |
|---|---|---|
| 1 | 20 | 20 |
| 2 | 20,10 | 30 |
| 3 | 20,10,50 | 80 |
| 4 | 70 | 70 |
| 5 | 70,25 | 95 |
| 6 | 25,35 | 60 |
| 7 | 25,35,30 | 90 |
| 8 | 25,35,30,5 | 95 |
| 9 | 5,80 | 85 |
最大总重量为 95。其中 70、25 和 25、35、30、5 都满足要求,按题意选择靠后的组合,即 25、35、30、5。
第(2)小题
j<len(a)
s-=a[i]
s>=bests
程序分析
a=[20,10,50,70,25,35,30,5,80]
weight=100
i=j=s=0
besti=bestj=bests=0
while ①:
...程序从数组首端开始处理,i、j、s 的初值均为 0;besti、bestj、bests 也初始化为 0,供后续记录候选组合。外层循环的具体处理分为加入货物、处理超载和保存候选三个部分。
s+=a[j]
j+=1先把下标 j 对应货物的重量加到 s,再将 j 加 1。因此加入后,最新货物的下标是 j-1,j 指向下一件待加入的货物。
while i<=j and s>weight:
②
i+=1加入货物后若超载,就进入内层循环。每执行一次 i+=1,连续组合的左端便向右移动一位;当总重量不再超过 weight 时,停止这一过程。空②需要配合左端位置的变化处理重量。
if ③:
bests=s;besti=i;bestj=j条件成立时,程序同时保存当前总重量及两个边界,避免重量和位置记录不一致。结合先加入 a[j]、再将 j 加 1 的顺序,保存的组合范围为下标 i 到 j-1,即左闭右开的区间 [i,j)。
填空分析
①
外层循环紧接着要访问 a[j]。j 从 0 开始,每轮增加 1,最后一件货物的下标为 len(a)-1;处理完后 j=len(a),必须停止。因此填写 j<len(a)。
②
s 已包含当前连续组合的重量。移走左端货物时,应先减去当前 a[i],再由已有的 i+=1 移动左边界;若先改变 i,就会减错对象。因此填写 s-=a[i]。循环结束后,s 对应调整后的 [i,j) 区间,且不超过载重量。
③
此时当前组合已经满足载重限制。若 s 大于 bests,应保存更大的载重;若两者相等,也应覆盖旧记录,因为 j 按从左到右的顺序推进,当前组合是后出现的组合,符合“选取最后一个”的要求。因此填写 s>=bests。
补全后,本题最终记录 bests=95、besti=4、bestj=8,对应 a[4:8] 中的 25、35、30、5。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_jinliqu_q013
