1.问题描述
对于给定的正整数n(n≥1),求1~n构成的集合的所有子集(幂集)
2.解法1
采用直接穷举法求解,将1~n的存放在数组a中,求解问题变为构造集合a的所有子集。设集合a[0…2]={1,2,3},其所有子集对应的二进制位及其十进制数如下
#include <bits/stdc++.h>
using namespace std;
void inc(int b[], int n) {
for(int k = 0; k < n; k++) {
if(b[k])
b[k] = 0;
else {
b[k] = 1;
break;
}
}
}
void PSet(int a[], int b[], int n) {
int pw = (int)pow(2,n);
cout << "1~" << n << "的幂集为:" << endl; // 执行2^n次
for(int i = 0; i < pw; i++) {
cout << "{";
for(int k = 0; k < n; k++)
if(b[k])
cout << a[k];
cout << "}";
inc(b, n);
}
cout << endl;
}
int main() {
int a[] = {1, 2, 3};
int b[] = {0, 0, 0};
int n = 3;
PSet(a, b, n);
return 0;
}
3. 解法2:采用增量穷举法求解1~n的幂集,当n=3时的求解过程
#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > ps; // 集合的集合
void Pset(int n) {
vector<vector<int> > ps1; // 辅助的集合的集合
vector<vector<int> >::iterator it;
vector<int> s;
ps.push_back(s); // 添加空集到集合元素中
for(int i = 1; i <= n; i++) {
ps1 = ps;
for(it = ps1.begin(); it != ps1.end(); it++)
(*it).push_back(i); // ps1这个集合中的每个元素的末尾加i
for(it = ps1.begin(); it != ps1.end(); it++) // 将ps1的每个集合的元素添加到集合ps中
ps.push_back(*it);
}
}
void dispps() {
vector<vector<int> >::iterator it;
vector<int>::iterator sit;
for(it = ps.begin(); it != ps.end(); it++) {
cout << "{";
for(sit = (*it).begin(); sit != (*it).end(); sit++)
cout << *sit;
cout << "}";
}
cout << endl;
}
int main() {
int n = 3;
Pset(n);
cout << "1~" << n << "的幂集为:";
dispps();
return 0;
}