任意集合的子集生成--C++实现

题目描述:

任意给定一个集合,集合中不含相同元素,要求打印出该集合所有的子集。

输入描述:

第一行输入该集合的元素个数。第二行输入该集合的所有元素。

输出描述:

按照字典序从小到大输出该集合的所有子集。

样例输入:

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); 
}

猜你喜欢

转载自blog.csdn.net/ACHENJIE/article/details/81181171
今日推荐