最佳答案
                
                                    // 递归方法
function getAnswer($amount, $need){
    if($need == 1){
        for ($i=1;$i<=$amount;$i++){
            $rst[] = [$i];
        }
        return $rst;
    } else {
        $rst = getAnswer($amount-1, $need-1);
        foreach($rst as $v){
            for ($i=$v[$need-2]+1;$i<=$amount;$i++){
                $v[$need-1] = $i;
                $result[] = $v;
            }
        }
        return $result;
    }
}
// 穷举出所有的组合
function getAllCombination($arr){
    $length = count($arr);
    for ($i=1; $i <= $length; $i++) { 
        $sub = getAnswer($length, $i);
        foreach ($sub as $k => $v){
            $cell = [];
            foreach ($v as $per_sub){
                $cell[] = $arr[$per_sub - 1];
            }
            $rst[] = $cell;
        }
    }
    return $rst;
}
    // 测试
    $arr = [2,2,3,3,4,6,10];
    $avg = array_sum($arr)/2;
    // 获取所有可能的组合
    $allCombination = getAllCombination($arr);
    // 每个组合与平均值的差
    $difference = $avg;
    $result = [];
    foreach ($allCombination as $key => $value) {
        $diff = abs(array_sum($value) - $avg);
        if($diff < $difference){
            $difference = $diff;
            $result = $value;
        }
    }
    dd($result);
结果:
array:3 [▼
  0 => 2
  1 => 3
  2 => 10
]
做了些调整,这个才能穷举出全部组合。递归的方法抄自 这里
 讨论数量: 
            
            
    
            // 递归方法
function getAnswer($amount, $need){
    if($need == 1){
        for ($i=1;$i<=$amount;$i++){
            $rst[] = [$i];
        }
        return $rst;
    } else {
        $rst = getAnswer($amount-1, $need-1);
        foreach($rst as $v){
            for ($i=$v[$need-2]+1;$i<=$amount;$i++){
                $v[$need-1] = $i;
                $result[] = $v;
            }
        }
        return $result;
    }
}
// 穷举出所有的组合
function getAllCombination($arr){
    $length = count($arr);
    for ($i=1; $i <= $length; $i++) { 
        $sub = getAnswer($length, $i);
        foreach ($sub as $k => $v){
            $cell = [];
            foreach ($v as $per_sub){
                $cell[] = $arr[$per_sub - 1];
            }
            $rst[] = $cell;
        }
    }
    return $rst;
}
    // 测试
    $arr = [2,2,3,3,4,6,10];
    $avg = array_sum($arr)/2;
    // 获取所有可能的组合
    $allCombination = getAllCombination($arr);
    // 每个组合与平均值的差
    $difference = $avg;
    $result = [];
    foreach ($allCombination as $key => $value) {
        $diff = abs(array_sum($value) - $avg);
        if($diff < $difference){
            $difference = $diff;
            $result = $value;
        }
    }
    dd($result);
结果:
array:3 [▼
  0 => 2
  1 => 3
  2 => 10
]
做了些调整,这个才能穷举出全部组合。递归的方法抄自 这里
          
                    
                    
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: