如何实现按分组容量上限均匀分配总量至分组数组?
正确实现PHP分组均匀分配函数(考虑容量上限)
原函数问题分析
原splitItems函数逻辑完全不符合“均匀分配”的需求:
- 循环逻辑是尝试每次给分组直接加上其最大容量,而非逐步均匀分配
- 剩余items直接全部加到第一个分组,忽略了其他分组的容量和分配公平性
- 以第一个分组的容量作为循环判断条件,导致小容量场景直接跳过循环,结果完全错误
比如输入splitItems([14, 2], 10)时,原函数会因为10 < 14跳过循环,直接给第一个分组加1,得到错误结果[1, 0]。
正确实现方案
以下实现优先保证均匀分配,同时严格遵守每个分组的容量上限,高效处理各种场景:
public static function splitItems($groups, $items) { $totalCapacity = array_sum($groups); // 如果待分配总量超过所有分组总容量,直接返回各组上限 if ($items >= $totalCapacity) { return $groups; } $groupCount = count($groups); $result = array_fill(0, $groupCount, 0); // 1. 先分配基础均匀量 $baseAllotment = floor($items / $groupCount); $remainingItems = $items % $groupCount; foreach ($groups as $index => $maxCapacity) { // 基础分配量不能超过当前分组的容量上限 $add = min($baseAllotment, $maxCapacity); $result[$index] += $add; $items -= $add; } // 2. 分配剩余的items,优先给还有剩余容量的分组 $currentIndex = 0; while ($items > 0 && $currentIndex < $groupCount) { $availableSpace = $groups[$currentIndex] - $result[$currentIndex]; if ($availableSpace <= 0) { $currentIndex++; continue; } // 取剩余items和可用容量的较小值分配 $add = min($items, $availableSpace); $result[$currentIndex] += $add; $items -= $add; $currentIndex++; } return $result; }
验证示例
- 输入
splitItems([14, 2], 10):- 总容量16 > 10,基础分配量为5,剩余0
- 第一个分组加5(小于14),第二个分组只能加2(达到上限),剩余items为10-5-2=3
- 剩余3全部分配给第一个分组,最终结果
[8, 2],符合预期
- 输入
splitItems([6, 8, 2], 14):- 总容量16 >14,基础分配量为4,剩余2
- 三个分组分别加4、4、2(第三个分组达上限),剩余items为14-4-4-2=4
- 剩余4依次分配给第一个分组(加2到上限6)、第二个分组(加2到6),最终结果
[6, 6, 2],符合预期
补充说明
如果待分配总量超过所有分组的总容量,函数会直接返回各组的容量上限,避免无效分配。若需要处理这种溢出场景,可以添加异常抛出或自定义逻辑。
内容的提问来源于stack exchange,提问作者Ered
相关产品推荐
相关产品推荐

