幂集,就是一个集合的所有子集,包括空集
下面附着代码,具体实现的过程代码下面:
各部分代码如下:
首先是 headF.h(headFile的意思)
1 #pragma once 2 3 #include<cstdio> 4 #include<vector> 5 6 using namespace std; 7 8 extern vector<vector<int>> ps;//存放幂集 9 10 void Insertion(int i);//向幂集ps中的每个集合元素添加i 并插入到ps中 11 void powerset(int i, int n);//求1~n的幂集ps 12 void printPowerset();//输出幂集
之后是 headF.cpp
1 #include "headF.h" 2 3 vector<vector<int>> ps; 4 5 void Insertion(int i) { 6 vector< vector<int> > ps1;//子幂集 7 vector< vector<int> >::iterator it;//幂集迭代器 8 9 ps1 = ps;//ps1存放原来的幂集 10 for (it = ps1.begin(); it != ps1.end(); it++) (*it).push_back(i);//在ps1的每个集合元素的末尾添加i 11 for (it = ps1.begin(); it != ps1.end(); it++) ps.push_back(*it);//将ps1的每个集合元素添加到ps中 12 } 13 14 void powerset(int i, int n) { 15 if (i <= n) { 16 Insertion(i);//将i插入到现有子集中产生新的子集 17 powerset(i + 1, n);//递归调用 18 } 19 } 20 21 void printPowerset() { 22 vector< vector<int> >::iterator it;//幂集迭代器 23 vector<int>::iterator sit;//幂集集合元素迭代器 24 int coun = 0; 25 26 for (it = ps.begin(); it != ps.end(); it++) { 27 printf("{"); 28 coun = 0; 29 for (sit = (*it).begin(); sit != (*it).end(); sit++) { 30 if (sit + 1 == (*it).end()) printf("%d", *sit); 31 else printf("%d,", *sit); 32 coun++; 33 } 34 35 printf("}%d ", coun); 36 } 37 printf("\n"); 38 }
最后一个:
#include "headF.h" int main() { int n = 3; vector<int> s; ps.push_back(s); powerset(1, n); printf("1~%d的幂集:\n", n); printPowerset(); return 0; }
额 其中形式可能有点 不一样的地方,这是因为我为了搞清楚vector是怎么实现的,加的一个计数变量
实现过程:
大概就是这样实现的,vector<int> ps 相当于一个一维数组 那么vector< vector<int>>就是一个二维的咯