// 幂集,集合的所有子集
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 从元素'a'起,n个元素的所有子集
vector<string> PowerSet(int n, char ch = 'a')
{
vector<string> v;
if (n == 1) {
v.push_back(string{ch});
} else {
vector<string> vv = PowerSet(n-1, ch);
for_each(begin(vv), end(vv), [&](const string& s){v.push_back(s+string{char{ch+n-1}}); v.push_back(s);});
v.push_back(string{char{ch+n-1}});
}
return v;
}
void PrintSet(const vector<string>& v, char ch = 'a')
{
int M = log2(v.size()+1);
cout << "Power set from " << char{ch} << " to " << char{ch+M-1} << ": " << endl;
for_each(begin(v), end(v), [](const string& s){cout << s << endl;});
cout << endl;
}
int main(int argc, char *argv[])
{
vector<string> v;
for (int i = 0; i < 4; i++)
{
v = PowerSet(i+1, '1');
PrintSet(v, '1');
}
return 0;
}