通过合理分配书籍到盒子中最大化得分的算法方案问询
最大化书籍分配总得分的解决思路
问题规则回顾
- 给定书籍页数数组
p、盒子容量数组s,满足书籍总数等于所有盒子容量之和 - 单个书籍的盒子得分:
2 × 书籍页数(等价于「最大值 + 最小值」,因为单本书的max和min都是自身) - 多书籍的盒子得分:
盒内书籍页数的最大值 + 最小值 - 目标:计算所有盒子得分总和的最大值
核心推导
总得分可以统一表述为所有盒子的最大值之和 + 所有盒子的最小值之和。要最大化总得分,需分别最大化这两部分的和:
- 最大值之和的最大化:每个盒子必须分配至少一本书,要让所有盒子的max总和最大,必然是将书籍数组中前
m个最大的元素(m为盒子数量)分别作为每个盒子的最大值(每个盒子分配一个)。这部分的和是固定的最优值。 - 最小值之和的最大化:在max分配完成后,剩余的书籍需要分配到容量>1的盒子中。为了让各盒子的min总和最大,应将剩余书籍中最小的元素集中分配到容量最大的盒子中,次小的分配到次大的,以此类推。这样可以让容量较小的盒子的min尽可能大。
具体步骤
- 排序处理
- 将书籍数组
p按降序排列 - 将盒子容量数组
s按降序排列
- 将书籍数组
- 分配最大值
- 取排序后
p的前m个元素(m是盒子数量),分别作为每个盒子的最大值,对应分配到排序后的s的每个盒子中(每个盒子先放入这个max元素)
- 取排序后
- 处理剩余书籍与最小值
- 剩余书籍为排序后
p中从第m+1位开始的元素,按升序排列(从小到大) - 遍历排序后的
s(从容量最大的到最小的):- 对于容量为
k的盒子,已放入1个max元素,还需补充k-1本书 - 从剩余书籍的**开头(最小的部分)**取
k-1本放入该盒子,确保小容量盒子能拿到更大的剩余元素,提升其min值
- 对于容量为
- 剩余书籍为排序后
- 计算总得分
- 单个书籍的盒子:得分=
2 × 书籍页数 - 多书籍的盒子:得分=
盒内最大值 + 盒内最小值 - 累加所有盒子的得分即为最终结果
- 单个书籍的盒子:得分=
示例验证
以题目中的示例为例:
pages = [7,1,1,12],降序排序后为[12,7,1,1]box = [3,1],降序排序后为[3,1]- 盒子数量
m=2,前2个max元素是12、7,分别分配到容量3和1的盒子 - 剩余书籍是
[1,1],升序排序后还是[1,1] - 容量3的盒子补充2本书后,内容为
[7,1,1],得分7+1=8 - 容量1的盒子仅含12,得分
12×2=24 - 总得分
8+24=32,与示例最优结果一致
对初始思路的修正
你最初的思路是将pages降序、s升序,优先给容量1的盒子分配最大元素,这个策略在部分场景有效,但并非通用。比如当存在多个容量>1的盒子时,按s升序分配会导致大容量盒子拿到偏大的剩余元素,反而让小容量盒子的min值变小,最终拉低min总和。正确的做法是将s降序排序,把最小的剩余元素集中到最大容量的盒子,保证小容量盒子的min尽可能大。
内容的提问来源于stack exchange,提问作者nicku
相关产品推荐
相关产品推荐

