
本文介绍一种改进的贪心算法,用于将一组整数划分为两个固定长度(如各5个元素)的子列表,在保证长度约束的前提下,尽可能使两组元素之和接近相等。
本文介绍一种改进的贪心算法,用于将一组整数划分为两个固定长度(如各5个元素)的子列表,在保证长度约束的前提下,尽可能使两组元素之和接近相等。
在实际工程与算法实践中,常需将一组数值“公平”地分到两个容器中——例如负载均衡、资源配比或实验分组场景。单纯按顺序或随机分配易导致显著偏差;而原问题中混合使用 sum() 实时计算与长度判断的逻辑,不仅效率低(每次循环调用 sum() 时间复杂度为 O(n)),还可能因优先级冲突导致长度与和值无法兼顾。
更优解法是采用预排序 + 双变量累加 + 分阶段策略:
- 降序排序:将输入列表按从大到小排列,确保大数优先分配,减少后续小数“补救失败”的概率;
- 维护独立和变量:用 sumX 和 sumY 实时跟踪两组当前和,避免重复调用 sum();
-
双约束优先级调度:
- 首先满足长度硬约束(每组最多 5 个元素);
- 当两组均未满时,优先填入当前和较小的一组;
- 当一组已满(如 len(listX) == 5),则剩余元素强制进入另一组;
- 当两组均已满(本例中为 10 个数分两组各 5 个),则退化为经典“最小和优先”贪心分配。
以下是完整可运行的 Python 实现:
import random
# 生成示例数据(10 个 10~200 的随机整数)
intList = [random.randint(10, 200) for _ in range(10)]
intList.sort(reverse=True) # 降序排列,关键优化
listX, listY = [], []
sumX = sumY = 0
for num in intList:
if len(listX) 10 数 + 容量限制)
if sumX <p>✅ <strong>关键优势</strong>: </p>
- 时间复杂度稳定为 O(n log n)(主要消耗在排序),远优于原版 O(n²);
- 显式分离长度控制与和值平衡逻辑,语义清晰、易于扩展(如支持 3 组、带权重分配);
- 自然适配“多列表扩展”:只需将 listX/listY 替换为列表数组 groups = [[], [], []],并维护对应 sums = [0, 0, 0],再按 min(sums) 索引分配即可。
⚠️ 注意事项:
- 该算法属于近似最优解(NP-hard 的划分问题无多项式精确解),但对多数实际数据效果优异;
- 若需严格最优(如总和差最小),应使用动态规划(适用于总和不太大的场景)或整数规划求解器;
- 当输入数量不等于目标总长度(如 11 个数分两组各 5 个),需明确定义溢出策略(丢弃?允许超限?重分配?),本例默认前 10 个参与分配。
通过这一结构化设计,你不仅能解决“两个五元组的和值均衡”问题,更能将其作为模板,快速构建面向任意分组数、任意容量约束的公平分配系统。










