【发布时间】:2019-11-27 20:10:55
【问题描述】:
假设我有一个数组 [10000,5000,1000,1000],我想找到与给定数字最接近的数字总和。抱歉解释不好,但这里有一个例子:
假设我有一个数组 [10000,5000,1000,1000] 我想找到最接近的数字,比如 6000。
那么该方法应该返回 5000 和 1000
另一个例子:我们想要最接近 14000 的,那么他应该返回 10000 和 5000
我已经尝试使用下面的代码,这是一个工作,但如果 $desiredSum 和 $numbers 数组 很大。它运行如此缓慢,直到 php 执行超时
$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";
谁能帮帮我?
【问题讨论】:
-
这看起来像子集和问题。数组的大小可以有多大?
-
这不是你之前问过的stackoverflow.com/questions/58918556/…。
-
@NigelRen,是的。我之前被问过,但这个解决方案在大阵列上运行缓慢
-
您是否检查了其他解决方案以了解其执行情况?
-
@vivek_23 大约有 100++ 个元素 .. 因为当我在我的项目上实现时,数据库上也有很多行 .. 然后我将这些行放入 $numbers 数组中......任何想法先生?
标签: php combinations