1. 程式人生 > >任意集合的子集生成--C++實現

任意集合的子集生成--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); 
}