給定數組 [1,2,3,4,5],生成所有可能的子集組合(冪集),共 2^n 種。
<?php
$arr = [1,2,3,4,5];
$result = [];
function combine($prefix, $index, $arr, &$result) {
if ($index === count($arr)) {
$result[] = $prefix;
return;
}
// 不包含當前元素
combine($prefix, $index + 1, $arr, $result);
// 包含當前元素
combine(array_merge($prefix, [$arr[$index]]), $index + 1, $arr, $result);
}
combine([], 0, $arr, $result);
echo '<pre>';
print_r($result);
echo '</pre>';
<?php
$arr = [1,2,3,4,5];
$n = count($arr);
$total = 1 << $n; // 2^n
$result = [];
for ($mask = 0; $mask < $total; $mask++) {
$subset = [];
for ($i = 0; $i < $n; $i++) {
if ($mask & (1 << $i)) {
$subset[] = $arr[$i];
}
}
$result[] = $subset;
}
print_r($result);
n > 20 時 2^n 爆炸,需改用啟發式/動態規劃/貪心算法,或僅生成滿足條件的組合 (剪枝)。