const MAX_SUM = 50;
$total = []; // Store the new data
$curKey = 0; // Store the current key of $total array.
foreach ($array as $key => $value) {
while ($value) {
// Get the current sum for the current key:
$curSum = array_sum($total[$curKey] ?? []);
// If the max was reached, we can go to the next key:
if ($curSum == MAX_SUM) $curKey++;
// Now, compute if the value to add (max to reach 50);
$add = $value + $curSum > MAX_SUM // If above,
? MAX_SUM - $curSum // got only the difference,
: $value; // else, use the full value.
// Add the value
$total[$curKey][$key] = $add;
// Finally, remove what we added just before.
$value -= $add;
}
}
print_r($total);
$groupLimit = 50; // declare as a variable to avoid "magic numbers" in code
$result = [];
$groupKey = 0;
foreach ($array as $key => $value) {
while ($value) {
$sum = array_sum($result[$groupKey] ?? []); // get group sum
$value -= $result[$groupKey][$key] = min($groupLimit - $sum, $value); // push key with limited value; decrease value
$groupKey += ($sum + $result[$groupKey][$key] === $groupLimit); // only increment group key if at $groupLimit
}
}
var_export($result);
3条答案
按热度按时间6yoyoihd1#
只是心理游戏
demo
bihw5rsg2#
若要创建一个数组,其中每个条目的总和不超过给定的数量,可以使用迭代方法。
让我们从一个空数组和一个表示该数组的工作索引的变量开始,在遍历输入数组时,我们将最大可能的剩余量添加到新数组中,如果达到极限,我们将递增索引变量,只要输入数组还没有被完全浏览,我们就继续操作。
代码:
输出:
另请参见@mickmackusa的nice answer。
neskvpey3#
我对这项任务的思路与@Syscall的"推送和消费"方法一致。
1.迭代输入数组以访问键和值。
1.使用一个内部循环重复处理当前值,直到它被减法完全消耗。只有在值减为零时才中断循环。
代码:(Demo)