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

PHP实现物品按不同组容量均匀分配的技术方案问询

PHP实现物品均匀分配到不同容量组的方案

核心思路

要让各组的使用次数尽可能均匀,按以下步骤执行:

  1. 计算所有组的单轮总容量(即所有组各用一次能装的物品总数)
  2. 算出所有组能完整循环的基础次数,作为各组的初始分配次数
  3. 计算基础轮数后剩余的物品数量
  4. 按组容量从小到大排序,优先给小容量的组追加次数(小容量组多一次带来的总物品增量更小,能保证次数差异最小),直到剩余物品分配完毕

代码实现

<?php
// 待分配总物品数
$totalItems = 199950;

// 组配置:键为组标识,值为单组容量
$groups = [
    'Group #1' => 50,
    'Group #2' => 100,
    'Group #3' => 250,
    'Group #4' => 500,
    'Group #5' => 1000,
];

// 计算单轮所有组的总容量
$totalPerRound = array_sum($groups);

// 基础循环次数(所有组至少分配的次数)
$baseCount = floor($totalItems / $totalPerRound);

// 剩余待分配的物品数
$remaining = $totalItems % $totalPerRound;

// 初始化分配结果,所有组先设为基础次数
$allocation = array_fill_keys(array_keys($groups), $baseCount);

// 将组按容量从小到大排序,优先给小容量组追加次数
uasort($groups, function($a, $b) {
    return $a - $b;
});

// 分配剩余物品
foreach ($groups as $groupName => $capacity) {
    while ($remaining >= $capacity) {
        $allocation[$groupName]++;
        $remaining -= $capacity;
    }
    if ($remaining === 0) {
        break;
    }
}

// 输出分配结果
echo "分配结果:\n";
foreach ($allocation as $group => $count) {
    echo "{$count} × {$group}\n";
}
?>

示例验证

代入题目数据计算:

  • 单轮总容量:50+100+250+500+1000=1900
  • 基础次数:199950 ÷ 1900 = 105(取整)
  • 剩余物品:199950 - 105×1900 = 450

按容量从小到大分配剩余物品:

  1. 给Group #1(50)加1次,剩余400
  2. 给Group #2(100)加1次,剩余300
  3. 给Group #3(250)加1次,剩余50
  4. 给Group #1再加1次,剩余0

最终得到的分配结果与题目示例完全一致:
107 × Group #1,106 × Group #2,106 × Group #3,105 × Group #4,105 × Group #5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:05:27