现在有一个没有重复元素的整数集合S,求S的所有子集
思路:通过二进制来确定有哪些子集,动态规划的方式更好理解
<?php
function subset($arr) {
$D[-1] = [[]];
$num = count($arr);
for ($i = 0; $i < $num ; $i ++) {
$D[$i] = $D[$i - 1];
$newSubset = [];
foreach ($D[$i - 1] as $item) {
$item[] = $arr[$i];
$newSubset[] = $item;
}
$D[$i] = array_merge($D[$i], $newSubset);
}
return $D[$num - 1];
}
$arr = [1,2,3];
$ret = subset($arr);
print_r($ret);
function subsets($arr) {
$num = count($arr);
$end = pow(2, $num);
$arrRet = array();
for ($i = 0; $i < $end; $i ++) {
$k = $i;
$arrRet[$i] = array();
for ($j = 0; $j < $num; $j ++) {
$flag = $k % 2;
if ($flag == 1) {
$arrRet[$i][] = $arr[$j];
}
$k = intval($k / 2);
}
}
print_r($arrRet);
}