找到尽可能多的元素,总结尽可能接近给定的数字

时间:2014-09-30 11:01:32

标签: arrays algorithm

给定一个整数数组,A 1 ,A 2 ,...,A n ,以及整数P,C。 / p>

从数组A中找出一组整数C,其中总和尽可能接近P,并且应该使用尽可能多的元素。

实施例

A = [3, 7, 2, 7, 25, 10, 5, 12, 1]
P = 15
C = 4

S1 = [3, 5, 7] = 15
S2 = [2, 5, 7, 1] = 15
S3 = [3, 5, 7, 1] = 16
S4 = [2, 7, 7] = 16

2 个答案:

答案 0 :(得分:0)

这是我提出的一个递归解决方案,但它并没有真正削减它,对不起,如果它不是最漂亮的代码片段,这就是我来到这里的原因。

$A = array();
$P = rand(1000, 9999) / 100;

for($i = 0; $i < 100; $i++)
    $A []= rand(100, 999) / 100;

print_r(array($P, $A));

for($i = 0, $ASz = count($A); $i < $ASz; $i++)
{
    $Aclone = $A;

    array_splice($Aclone, $i, 1);

    $result = foo($Aclone, $P, array($A[$i]));

    print_r(array($result, array_sum($result)));
}

function foo($A, $P, $Set)
{
    $lowest = abs($P - array_sum($Set));
    $lowestS = $Set;
    $popVal = -1;

    foreach($A as $offset => $newNum)
    {
        $Pr = $Set;
        $Pr []= $newNum;

        $qDist = abs($P - array_sum($Pr));

        if($qDist < $lowest)
        {
            $lowestS = $Pr;
            $lowest = $qDist;
            $popVal = $offset;
        }
    }

    if($popVal == -1)
        return $Set;

    $tempA = $A;
    array_splice($tempA, $popVal, 1);

    return foo($tempA, $P, $lowestS);
}

测试:http://sandbox.onlinephpfunctions.com/code/4a3dcd9af8b9a4561903007ccea343d745b8ab71

答案 1 :(得分:0)

它实际上与流行的问题相同&#34;改变制作。&#34;。检查链接的详细信息和算法的代码实现:

http://karmaandcoding.blogspot.in/2012/01/coin-change-problem-with-limit-on.html

Coin change with limited number of coins