PHP实现物品按不同组容量均匀分配的技术方案问询
PHP实现物品均匀分配到不同容量组的方案
核心思路
要让各组的使用次数尽可能均匀,按以下步骤执行:
- 计算所有组的单轮总容量(即所有组各用一次能装的物品总数)
- 算出所有组能完整循环的基础次数,作为各组的初始分配次数
- 计算基础轮数后剩余的物品数量
- 按组容量从小到大排序,优先给小容量的组追加次数(小容量组多一次带来的总物品增量更小,能保证次数差异最小),直到剩余物品分配完毕
代码实现
<?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
按容量从小到大分配剩余物品:
- 给Group #1(50)加1次,剩余400
- 给Group #2(100)加1次,剩余300
- 给Group #3(250)加1次,剩余50
- 给Group #1再加1次,剩余0
最终得到的分配结果与题目示例完全一致:
107 × Group #1,106 × Group #2,106 × Group #3,105 × Group #4,105 × Group #5
内容的提问来源于stack exchange,提问作者hacpires
相关产品推荐
相关产品推荐

