题目描述:
任意给定一个集合,集合中不含相同元素,要求打印出该集合所有的子集。
输入描述:
第一行输入该集合的元素个数。第二行输入该集合的所有元素。
输出描述:
按照字典序从小到大输出该集合的所有子集。
样例输入:
5
1 6 5 3 2
样例输出:
1
1 2
1 2 3
1 2 3 5
1 2 3 5 6
1 2 3 6
1 2 5
1 2 5 6
1 2 6
1 3
1 3 5
1 3 5 6
1 3 6
1 5
1 5 6
1 6
2
2 3
2 3 5
2 3 5 6
2 3 6
2 5
2 5 6
2 6
3
3 5
3 5 6
3 6
5
5 6
6
解题思路:
每次在p(输入集合)中拿出一个符合条件的元素放入rslt(输出集合)中,符合条件的元素是指该元素比rslt中的任意一个元素都要大。然后利用递归构造子集。具体实现请看代码。
#include <iostream>
#include <algorithm>
using namespace std;
void print_subset(int n,int p[],int rslt[],int cur)
{
for(int i=0;i<cur;i++)cout<<rslt[i]<<' ';//打印当前集合
int s;
if(cur==0)s=0;
else
{
s=rslt[cur-1];
cout<<'\n';
}
if(s<p[n-1])//当集合rslt中的最大元素小于p中的最大元素时,进行下一步
{
for(int i=0;i<n;i++)
{
if(p[i]>s)
{
rslt[cur]=p[i];
print_subset(n,p,rslt,cur+1);//递归构造子集
}
}
}
}
int main()
{
int n;cin>>n;
int p[n];
for(int i=0;i<n;i++)cin>>p[i];
int rslt[n]={0};
sort(p,p+n);//将集合中的元素按升序排列好
print_subset(n,p,rslt,0);
}