$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);
4条答案
按热度按时间a8jjtwal1#
我正在尝试通过相加来组合数组中的数字,这样最大值只能乘以30
因此,当您组合数字时,可以通过以下方法在数组中获得尽可能最小的一组值,同时确保max值保持为30:
qxgroojn2#
20jt8wwn3#
你只需要循环一次就可以得到这个
Working demo.
s4chpxco4#
我相信找到大多数空间优化/紧凑的结果需要一个嵌套循环。我的建议类似于this answer of mine中的
firstFitDecreasing()
函数,除了在这种情况下嵌套循环访问相同的数组。我添加了几个简单的条件来防止不必要的迭代。通过在处理AND之前将较大的数字放在较小的数字之前,并通过尝试将多个后续值添加到较早的值,可以使结果中的总元素数更少。
参见my comparative demonstration。
1.我认为@Clint的答案误解了任务,并通过对所有值求和然后在结果数组中分配最大值来破坏数据。
1.对于
$array = [10,30,5,10,5,13,14,15,10,5];
和$limit = 30;
等更具挑战性的输入数据,我的解决方案提供了比@nice_dev和@rahul的答案更密集的结果。