/*
暴力枚举
subsets:
给出一组数组,列出所有可能的子集
对于n个元素,有2^n个子集
对于此题构造一个bool类型的向量select
每个元素可以选也可以不选
*/
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
vector<vector<int>> Subset(vector<int> &Arr)
{
sort(Arr.begin(),Arr.end());
vector<vector<int>>result;
vector<bool>select(Arr.size(), false );
subset(Arr, select, 0, result);
return result;
}
private:
void subset(vector<int>&Arr, vector<bool>&select, int step, vector<vector<int>>&result)
{
if (step == Arr.size())
{
vector<int>subset;
for (int i = 0; i < Arr.size(); i++)
{
if (select[i])
subset.push_back(Arr[i]);
}
result.push_back(subset);
return;
}
//不选select[step]
select[step] = false;
subset(Arr, select, step + 1, result);//每个select都有Arr.size()元素,可能其中是空
//选select[step]
select[step] = true;
subset(Arr, select, step + 1, result);
}
};
int main()
{
Solution s1;
int n;
vector<vector<int>>result;
vector<int>vec;
cout << "请输入n:";
cin >> n;
for (int i = 0; i <n; i++)
{
vec.push_back(i + 1);
}
result = s1.Subset(vec);
cout << "输出结果:" << endl;
for (int i = 0; i < result.size(); i++)
{
for (int j = 0; j < result[i].size(); j++)
{
cout << result[i][j] << ",";
}
cout << endl;
}
system("pause");
return 0;
}
Subsets
最新推荐文章于 2019-06-11 10:20:00 发布