需要对此函数进行适当的数组计算

时间:2017-02-15 22:31:22

标签: php arrays algorithm function loops

这是我的算法要求,以找到捐赠者身份捐赠总额 等于所需的捐款

<?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);

?>

2 个答案:

答案 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? ...

下面:

  • $ requiredDonation s
  • $ userDonation 整数集
  • magicalFunction 会将整数的子集返回到 s 。 (非虚假答案是正确的 NP-Complete问题的真实答案,错误是错误的)

wikipedia link为子集求和问题提供了一些解决方案,谷歌搜索其他问题。

  • Here是一个推荐。
  • Here是基于PHP的求解器。

您可能还希望评估要求,因为如果搜索的捐款数量很大,问题可能会失控。 (这是NP-Complete问题的一个属性。它们可能需要很长时间才能完全解决)。