子集合问题
问题描述:求一个含有n个元素的集合的所有子集合
分析思路:子集合最方便的解法可以使用递归回溯法解决。分析子集合问题,可以发现该问题可以转换为回溯法中的子集树问题,我们只需要在递归时建立一个二叉子集树,该子集树每一层对应集合中的一个元素,假定左分支值为0,右分支值为1.在将该子集合树安一条分支遍历到叶子节点后,即可得到一个0、1序列,该序列中值为0的表示不在子集中,值为1的表示在子集中。如下图:
母集合为{a,b,c}.从最左边走到叶子节点得到的集合序列为(0,0,0),表示该子集为空集;到第二个叶子节点的集合序列为(0,0,1),表示该子集为{c}; ... ;最右边的叶子节点的集合序列为(1,1,1),表示该子集为{a,b,c}。
#include <iostream>
using namespace std;
int n;
int *x,*s;
void output() { //输出子集合
bool isEmpty = true;
for(int i=1;i<=n;i++) {
if(x[i] != 0) {
isEmpty = false;
cout << s[i];
}
}
if(isEmpty) {
cout << "空集";
}
cout << endl;
}
void backtrack(int i) { //递归回溯求子集合序列
if(i>n)
output();
else {
for(int j=0;j<=1;j++) {
x[i] = j;
backtrack(i+1);
}
}
}
int main()
{
cout << "input n: "; //输入母集合一共有多少个元素
cin >> n;
x = new int[n+1];
s = new int[n+1];
cout << "input the set:\n";
for(int i=1;i<=n;i++) {
cin >> s[i];
}
cout << "the subset is :\n";
backtrack(1);
return 0;
}
运行结果: