说我有一个array [10000,5000,1000,1000]
,我想找到与给定数字最接近的数字总和。抱歉,我们的解释不正确,但是这里有一个例子:
说我有一个array [10000,5000,1000,1000]
,我想找到最接近的数字,例如 6000 。
然后该方法应返回 5000和1000
另一个示例:我们希望最接近 14000 ,因此他应该返回 10000和5000
在这里我尝试过php,但是当我输入 6000 时出现了问题,我应该得到 5000和1000
<?php
$arr = [10000,5000,1000,1000];
$x = 6000;
var_dump(eek($x,$arr));
function eek($x,$arr)
{
$index = [];
$counter = 0;
foreach($arr as $val)
{
if($counter + $val <= $x)
{
$counter += $val;
$index[] = $val;
}
elseif($counter + $val >= $x)
{
$counter += $val;
$index[] = $val;
break;
}
}
if($counter == $x)
{
return $index;
}
elseif($counter >= $x)
{
return $index;
}
else
{
return [];
}
}
?>
有人对此有解决方案吗?
答案 0 :(得分:1)
计算数组从大到小的顺序
这是从您的解决方案开始的解决方案
function eek($x,$arr)
{
$index = [];
$counter = 0;
foreach($arr as $key => $val) {
if($counter + $val < $x) {
$counter += $val;
$index[] = $val;
} else {
if (isset($arr[$key+1]) && (abs($counter + $arr[$key+1] -$x) < abs($counter + $val -$x))) {
continue;
} else {
$index[] = $val;
return $index;
}
}
}
return $index;
}
答案 1 :(得分:0)
此处适用于float和负值:
$numbers = array(
10000,5000,1000,1000
);
$desiredSum = 6000;
$minDist = null;
$minDist_I = null;
// Iterate on every possible combination
$maxI = pow(2,sizeof($numbers));
for($i=0;$i<$maxI;$i++) {
if(!(($i+1) % 1000)) echo ".";
// Figure out which numbers to select in this
$sum = 0;
for($j=0;$j<sizeof($numbers);$j++) {
if($i & (1 << $j)) {
$sum += $numbers[$j];
}
}
$diff = abs($sum - $desiredSum);
if($minDist_I === null || $diff < $minDist) {
$minDist_I = $i;
$minDist = $diff;
}
if($diff == 0) break;
}
$chosen = array();
for($j=0;$j<sizeof($numbers);$j++) {
if($minDist_I & (1 << $j)) $chosen[] = $numbers[$j];
}
echo "\nThese numbers sum to " . array_sum($chosen) . " (closest to $desiredSum): ";
echo implode(", ", $chosen);
echo "\n";