这是我的算法要求,以找到捐赠者身份捐赠总额 等于所需的捐款
<?php
function magicalFunction($donationArray , $expactedValue ){
/*need some algorithm get key of elements from $donationArray which sum is
equal to $expactedValue $*/
}
$userDonation = array(
'1' => 100,
'4' => 8064,
'5' => 578,
'6' => 752,
'21' => 512,
'121' => 660,
'152' => 135,
'199' => 1350
);
$requiredDonation = 886;
$selectedDonatee = magicalFunction( $userDonation , $requiredDonatee );
// return false
$requiredDonation = 1465;
$selectedDonatee = magicalFunction( $userDonation , $requiredDonatee );
// return array(5, 6, 152);
?>
答案 0 :(得分:1)
这是一种方法。对于较大的输入数组,这将是缓慢的,但它在理论上是有效的。此外,这将返回第一个键组合,其值与其找到的目标值相加,并且将忽略任何其他可能的组合。
function findSet($values, $target, $keys = [], $sum = 0) {
while ($k = key($values)) {
$v = reset($values);
// return the current set of keys if the target sum is found
if ($sum + $v == $target) return array_merge($keys, [$k]);
// remove the current value
unset($values[$k]);
// recursively test the remaining values and return if a matching set is found
if ($sum + $v < $target) {
$test = findSet($values, $target, array_merge($keys, [$k]), $sum + $v);
if ($test) return $test;
}
}
// return false if no matching sets are found
return false;
}
$result = findSet($userDonation, 1465);
答案 1 :(得分:0)
这是Subset Sum Problem,它是NP-Complete。
...给定一组整数和一个整数s,是否有任何非空子集总和为s? ...
下面:
wikipedia link为子集求和问题提供了一些解决方案,谷歌搜索其他问题。
您可能还希望评估要求,因为如果搜索的捐款数量很大,问题可能会失控。 (这是NP-Complete问题的一个属性。它们可能需要很长时间才能完全解决)。