天天看点

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