使用php查找其和等于给定目标的数组的子集

使用php查找其和等于给定目标的数组的子集,php,Php,我正在尝试实现以下功能: 例如: $a=array(1,10,25,50); $number=15; o/p : 15=1+1+1+1+1+10; 完成: 为此创建一个递归函数: function getcomb($arr,$actualNum, $total=0, $combination_array = array()){ foreach($arr as $k=>$v){ if($v > $actualNum) continue;

我正在尝试实现以下功能:

例如:

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


为此创建一个递归函数:

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);
函数getcomb($arr,$actualNum,$total=0,$combination\u array=array()){ foreach($arr as$k=>$v){ 如果($v>$actualNum)继续; $shiftVal=$v;
如果($total+$shiftVal)不像看上去那么简单,我们可以通过递归来实现它?这是一个硬币兑换问题吗?您想要达到数字的最有效方法(使用最少的加法)?还是任意组合?
$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);
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);