2017-05-31 39 views
1

我想实现下面的功能等于给定的目标的子集:查找数组,其总和使用PHP

例如:

$a=array(1,10,25,50); 
$number=15; 
o/p : 15=1+1+1+1+1+10; 
+1

不像看起来 –

+0

可以通过我们做递归它容易吗? –

+0

这是一个硬币更换问题? –

回答

1

完成:

$a=array(1,10,25,50); 
rsort($a); 
$number=15; 
$final = []; 
$remainder = $number; 

foreach($a as $num) { 
    do { 
     if($num <= $number) { 
      $final[] = $num; 
      $remainder -= $num; 
     } 
     if($remainder == 0) break; 
    } while($remainder >= $num); 
} 

echo $number . " = " . implode(' + ', $final); 

而且此方法:

$a=array(1,10,25,50); 
rsort($a); 
$number=15; 
echo $number . " = "; 
$final = []; 
foreach($a as $num) { 
    if((int)($number/$num) > 0) { 
     $final = array_merge($final, array_fill(0, (int)($number/$num), $num)); 
     $number -= (int)($number/$num) * $num; 
    } 
} 
echo implode(' + ', $final); 
1

M AKE这个递归函数:

function getcomb($arr,$actualNum, $total=0, $combination_array = array()){ 
    foreach($arr as $k=>$v){ 
     if($v > $actualNum) continue; 
      $shiftVal = $v; 

      if($total+$shiftVal <= $actualNum){ 

       $combination_array[] = $shiftVal; 
       $total += $shiftVal; 
       $reminder = $actualNum-$total; 
       //echo "<pre>combination_array";print_r($combination_array); 
       if($reminder <= 0){ 
        return $shiftVal; 
       }else{ 
        return $shiftVal .' + '.getcomb($arr, $actualNum,$total, $combination_array); 
       } 

      } 
    } 
} 
$a=array(1,10,25,50); 
rsort($a); 

$number=15; 
echo $str = getcomb($a, $number); 

Cleck here to check output