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

如何将数字列表最多分为5组,使每组总和尽可能最小?

受限组数下的负载均衡分组实现思路

你要解决的是最多分5组,让各组的最大总和尽可能小的负载均衡问题,核心是通过贪心策略实现高效分组,以下是具体思路和实现:

核心思路

1. 降序排序优先处理大数

先将数字列表按降序排列,避免大数字最后被迫与其他大数组合,导致某组总和过高。比如示例数据排序后为:[1420, 1075, 964, 122, 102, 86, 52]。

2. 初始化分组

根据数字数量和最大组数(5)初始化分组:如果数字数量≤5,直接每个数字单独一组;否则初始化5个空组。

3. 贪心分配小数

遍历排序后的剩余数字,每次将当前数字放入当前总和最小的组中,以此平衡各组负载,确保最大组的总和尽可能小。

示例执行流程

  1. 排序后取前3个大数分别放入3个组:[[1420], [1075], [964], [], []]
  2. 处理122:放入总和最小的第4组 → [[1420], [1075], [964], [122], []]
  3. 处理102:放入总和最小的第5组 → [[1420], [1075], [964], [122], [102]]
  4. 处理86:放入总和最小的第5组(当前总和102)→ [[1420], [1075], [964], [122], [102, 86]]
  5. 处理52:放入总和最小的第4组(当前总和122)→ [[1420], [1075], [964], [122, 52], [102, 86]],与示例结果一致。

Python 实现代码

def group_numbers(numbers, max_groups=5):
    # 降序排序数字
    sorted_nums = sorted(numbers, reverse=True)
    # 初始化分组,最多max_groups个组,若数字更少则按实际数量初始化
    group_count = min(max_groups, len(sorted_nums))
    groups = [[] for _ in range(group_count)]
    
    for num in sorted_nums:
        # 找到当前总和最小的组
        target_group = min(groups, key=lambda x: sum(x))
        target_group.append(num)
    
    return groups

# 测试示例数据
numbers = [52, 86, 102, 122, 964, 1075, 1420]
result = group_numbers(numbers)
print(result)

补充说明

  • 时间复杂度:主要由排序决定,为O(n log n),分配过程为O(n*k)(k为最大组数,此处k=5,可忽略),效率极高。
  • 适用场景:贪心策略在大多数情况下能得到近似最优解;若需绝对最优,可考虑动态规划,但实现复杂度会大幅提升,普通场景下贪心策略足够实用。

内容的提问来源于stack exchange,提问作者maxjunerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:45:28