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

如何实现按分组容量上限均匀分配总量至分组数组?

正确实现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;
}

验证示例

  1. 输入splitItems([14, 2], 10):
    • 总容量16 > 10,基础分配量为5,剩余0
    • 第一个分组加5(小于14),第二个分组只能加2(达到上限),剩余items为10-5-2=3
    • 剩余3全部分配给第一个分组,最终结果[8, 2],符合预期
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:34:54