讨论数量:
// 递归方法
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
]
做了些调整,这个才能穷举出全部组合。递归的方法抄自 这里
结果:
做了些调整,这个才能穷举出全部组合。递归的方法抄自 这里