给定一个整数数组,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
答案 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