天天看點

c++求集合的幂集-遞歸實作

//離散數學華東師大章炯民版第一章課後習題17,有改動

//求10個元素的幂集1s不到

//該方法采用中序周遊二叉樹(實際這棵樹是不存在的)。對于第一個元素,左節點加進去,右節點去掉。對于第i一個節點,左加,右去。直到i大于元素的總個數。

#include<iostream>
#include<cstdio>
#include<Windows.h>
#include<string>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
#include<stack>
#include<list>
using namespace std;
const int maxn=100;
void print(vector<int>b)
{
	printf("{ ");
	for(int i=0;i<b.size();i++)
		printf("%d ",b[i]);
	printf("}\n");
}
void powerset(int i,vector<int>a,vector<int>b)
{
	if(i>a.size()-1)
		print(b);
	else{
		b.insert(b.end(),a[i]);
		powerset(i+1,a,b);
		vector<int>::iterator p=find(b.begin(),b.end(),a[i]);
		b.erase(p);
		powerset(i+1,a,b);
	}
}
int main()
{
	int n;
	while(cin>>n){
		vector<int>a(n),b;
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		int t0=GetTickCount();
		powerset(0,a,b);
		int t1=GetTickCount();
		cout<<"集合的幂集所花費的時間為:"<<t1- t0<<"ms."<<endl;
		
	}
	return 0;
}
           

//參考資料:http://zhidao.baidu.com/question/239026656.html&__bd_tkn__=6ca15d262c34b01d1718ee57adfd2cae860c8bf48078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157a5ff4329f61affd580f03de0125277aa741bc06327798737a22cefea744360e002f415bbb6f7e4049b6ddac9879ffaccbdc8d0ccc3727fe47a8