如何将数字列表最多分为5组,使每组总和尽可能最小?
受限组数下的负载均衡分组实现思路
你要解决的是最多分5组,让各组的最大总和尽可能小的负载均衡问题,核心是通过贪心策略实现高效分组,以下是具体思路和实现:
核心思路
1. 降序排序优先处理大数
先将数字列表按降序排列,避免大数字最后被迫与其他大数组合,导致某组总和过高。比如示例数据排序后为:[1420, 1075, 964, 122, 102, 86, 52]。
2. 初始化分组
根据数字数量和最大组数(5)初始化分组:如果数字数量≤5,直接每个数字单独一组;否则初始化5个空组。
3. 贪心分配小数
遍历排序后的剩余数字,每次将当前数字放入当前总和最小的组中,以此平衡各组负载,确保最大组的总和尽可能小。
示例执行流程
- 排序后取前3个大数分别放入3个组:
[[1420], [1075], [964], [], []] - 处理122:放入总和最小的第4组 →
[[1420], [1075], [964], [122], []] - 处理102:放入总和最小的第5组 →
[[1420], [1075], [964], [122], [102]] - 处理86:放入总和最小的第5组(当前总和102)→
[[1420], [1075], [964], [122], [102, 86]] - 处理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
相关产品推荐
相关产品推荐

