求集合的幂集

1、递归求解

// Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include using namespace std; /* 求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己"c" ; 倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc} 倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,ac,abc},加到幂积集合中,此时幂积中为:{b,c,bc,ab,ac,abc};最后再加上自己本身"a",为:{a,b,c,bc,ab,ac,abc}. */ #define MAX_LENGTH 100 //幂集的最大个数 /*pArr为输入的字符串,i为正在处理的字符,pResult为存储结果,num统计共有多杀个幂集*/ void powerSet(char *pArr, int i, char *pResult, int &num) { char tempArr[MAX_LENGTH]; strcpy(tempArr, pResult); if (i >= strlen(pArr)) { printf("{%s}/n", pResult); num++; } else { powerSet(pArr, i+1, tempArr, num); strncat(tempArr, (pArr+i), 1); powerSet(pArr, i+1, tempArr, num); } } int main() { char *pstr = "ABC"; char *pres = new char[MAX_LENGTH]; memset(pres, 0, sizeof(char)*MAX_LENGTH); int num = 0; powerSet(pstr, 0, pres, num); }

 

 

2、  利用二进制数与幂集之间的对应关系

 // Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include #include using namespace std; /* 二进制法求一个集合的幂集 作者:blackmanba 时间:2010年10月10日 */ /*x的二进制表示可以用来表示s的一个子集:对于x的第i位,如果为1,则此子集包含s的第i个元素,否则不包含。 因此,只要遍历 [0,2^n)的整数区间,就能列举出s的所有子集,这些子集的集合就是s的幂集*/ /*arr为输入的字符串,n为该数组的元素个数, result为存储结果的字符串数组*/ void powerSet(char *arr, int n, char* result[]) { int max_length = 2<<(n-1);//幂集的最大个数 for (int i=0; i

 

 

 

你可能感兴趣的:(算法与数据结构)