思路:
int arr[] = { 0,1,2,3,4 };
递归遍历整个数组,遍历到第0个位置,我们就求出含有0的所有子集,遍历到第1个位置,我们就求出含有1不含0的所有子集,依次类推,遍历到第3个位置,我们求出含有3而不含0 1 2 的所有子集。
//loc表示当前位置 loc == len为递归终止条件
void getAllSubSet(int* arr, int len, int loc, vector<vector<int> >&res, vector<int>v) {
if (loc == len) {
res.push_back(v);
return;
}
//2中情况 第一种情况 拿当前元素 第二种 不拿当前元素
getAllSubSet(arr, len, loc + 1, res, v);
v.push_back(arr[loc]);
getAllSubSet(arr, len, loc + 1, res, v);
}
int main()
{
int arr[] = { 2,3,4,5,6 };
vector<vector<int> >res;
for (int i = 0; i < 5; i++) {
vector<int>v;
v.push_back(arr[i]); //保证了该位置元素一定取到
getAllSubSet(arr, 5, i + 1, res, v); //现在进入到下一位置
}
//以下为输出结果用
for(int i = 0; i < res.size(); i++) {
for (int j = 0; j < res[i].size(); j++) {
cout << res[i][j] << " ";
}
cout << endl;
}
cout << res.size();
return 0;
}