You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过合理分配书籍到盒子中最大化得分的算法方案问询

最大化书籍分配总得分的解决思路

问题规则回顾

  • 给定书籍页数数组p、盒子容量数组s,满足书籍总数等于所有盒子容量之和
  • 单个书籍的盒子得分:2 × 书籍页数(等价于「最大值 + 最小值」,因为单本书的max和min都是自身)
  • 多书籍的盒子得分:盒内书籍页数的最大值 + 最小值
  • 目标:计算所有盒子得分总和的最大值

核心推导

总得分可以统一表述为所有盒子的最大值之和 + 所有盒子的最小值之和。要最大化总得分,需分别最大化这两部分的和:

  1. 最大值之和的最大化:每个盒子必须分配至少一本书,要让所有盒子的max总和最大,必然是将书籍数组中前m个最大的元素(m为盒子数量)分别作为每个盒子的最大值(每个盒子分配一个)。这部分的和是固定的最优值。
  2. 最小值之和的最大化:在max分配完成后,剩余的书籍需要分配到容量>1的盒子中。为了让各盒子的min总和最大,应将剩余书籍中最小的元素集中分配到容量最大的盒子中,次小的分配到次大的,以此类推。这样可以让容量较小的盒子的min尽可能大。

具体步骤

  1. 排序处理
    • 将书籍数组p按降序排列
    • 将盒子容量数组s按降序排列
  2. 分配最大值
    • 取排序后p的前m个元素(m是盒子数量),分别作为每个盒子的最大值,对应分配到排序后的s的每个盒子中(每个盒子先放入这个max元素)
  3. 处理剩余书籍与最小值
    • 剩余书籍为排序后p中从第m+1位开始的元素,按升序排列(从小到大)
    • 遍历排序后的s(从容量最大的到最小的):
      • 对于容量为k的盒子,已放入1个max元素,还需补充k-1本书
      • 从剩余书籍的**开头(最小的部分)**取k-1本放入该盒子,确保小容量盒子能拿到更大的剩余元素,提升其min值
  4. 计算总得分
    • 单个书籍的盒子:得分=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:05:30