php 合并数字数组,每个元素不超过预定义的最大值

suzh9iv8  于 2023-01-04  发布在  PHP
关注(0)|答案(4)|浏览(142)

我试着把数组中的数字相加,这样最大值只能是30。
例如,这是我的数组:

array(10,30,10,10,15);

将数组中的数字组合为最大值为30的项后,结果应为:

array(30,30,15);

如何做到这一点?

a8jjtwal

a8jjtwal1#

我正在尝试通过相加来组合数组中的数字,这样最大值只能乘以30
因此,当您组合数字时,可以通过以下方法在数组中获得尽可能最小的一组值,同时确保max值保持为30:

  • 首先,把它们分类。
  • 第二,不断地向sum中添加元素,直到你得到的sum〉30。
  • 第三,一旦某个元素无法再添加到总和中,就将当前总和添加到数组中,并使当前元素成为新的总和。
    • 代码:**
<?php

$arr = array(10,30,10,10,15);
sort($arr);

$res = [];
$curr_sum = 0;

foreach($arr as $each_value){
    if($curr_sum + $each_value <= 30) $curr_sum += $each_value;
    else{
        $res[] = $curr_sum;
        $curr_sum = $each_value;
    }
}

$res[] = $curr_sum;

print_r($res);
rsort($res);
qxgroojn

qxgroojn2#

$total = array_sum(array(10,30,10,10,15)); //assign sum totals from orignal array
$maxValue = 30; //assign max value allowed in array
$numberOfWholeOccurancesOfMaxValue = floor($total/$maxValue);
$remainder = $total%$maxValue;

//build array
$i=0;
while ( $i < $numberOfWholeOccurancesOfMaxValue ){
    $array[] = $maxValue;
    $i++;
}

$array[] = $remainder;

print_r($array);
20jt8wwn

20jt8wwn3#

你只需要循环一次就可以得到这个

$temp = array(10,30,10,10,15);
natsort($temp); // sorting to reduce hustle and complication
$result = [];
$i = 0;
$maxValue = 30;
foreach($temp as $v){
    // checking sum is greater or value is greater or $v is greater than equal to
    if(!empty($result[$i]) && (($result[$i]+$v) > $maxValue)){
        $i++;
    }
    $result[$i] = (!empty($result[$i]) ? ($result[$i]+$v) : $v);
}
print_r($result);

Working demo.

s4chpxco

s4chpxco4#

我相信找到大多数空间优化/紧凑的结果需要一个嵌套循环。我的建议类似于this answer of mine中的firstFitDecreasing()函数,除了在这种情况下嵌套循环访问相同的数组。我添加了几个简单的条件来防止不必要的迭代。

rsort($array);
foreach ($array as $k1 => &$v1) {
    if ($v1 >= $limit) {
        continue;
    }
    foreach ($array as $k2 => $v2) {
        if ($k1 !== $k2 && $v1 + $v2 <= $limit) {
            $v1 += $v2;
            unset($array[$k2]);
            if ($v1 === $limit) {
                continue 2;
            }
        }
    }
}
rsort($array);
var_export($array);

通过在处理AND之前将较大的数字放在较小的数字之前,并通过尝试将多个后续值添加到较早的值,可以使结果中的总元素数更少。
参见my comparative demonstration
1.我认为@Clint的答案误解了任务,并通过对所有值求和然后在结果数组中分配最大值来破坏数据。
1.对于$array = [10,30,5,10,5,13,14,15,10,5];$limit = 30;等更具挑战性的输入数据,我的解决方案提供了比@nice_dev和@rahul的答案更密集的结果。

相关问题