C++ 求一个集合的所有子集

设计一个减一算法,生成一个n元素集合的所有子集(包括空集和本身)。

例如一个集合{a,b,c,d},可分成两类集合:
1.不包括元素a的集合(即集合{b,c,d}的所有子集);
2.包括a元素的集合(即集合{b,c,d}的每个子集都加上元素a)
同理,{b,c,d}的子集可以分为包括元素b和不包括元素b的两类集合。

用上面说的方法,C++实现,尽量把过程说得详细明白一点,我不是为了做题,只是想学点东西,所以请不要仅把代码复制过来。

谢谢各位,好的话,还会有加分。

这个程序必然要使用递归来做。当然不用递归的话,编程复杂度高。另外不要认为递归降低效率,呵呵
比如你求一个数组char a[10]的所有子集,那么,你应该需要两个函数参数。
一个是数组指针,一个是数组元素个数。
并且对数组的元素个数进行判断,如果个数n == 1则递归条件终止
如果n > 1,那么就新建一个数组,并做一次扫描,依次剔除原数组中的一个元素,生成其子集,并进行递归

伪代码如下
void Function(char * a , int n)
{
char * b;
int j ,k ;
if(n > 1)
for ( int i = 0 ; i < n ; i++ )
{
b = new char[n-1] ;
for ( j = k = 0 ; j < n ; j++ )
if ( j != i ) b[k++] = a[j] ;
Function(b,n-1);
delete [] b ;
}
else 直接输出这个数组;

输出a数组
}

程序超简单的说,我就不详细写了,呵呵,算法你要明白
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-12-12
#include <stdio.h>

int n;
int a[10000]={0}; //输入的数没可能大于10000吧,10000估计要打印的时间。。。难想像

void print() //输出
{
int i;
for(i=1;i<=n;i++)
if(a[i])
printf("%d ",i);
printf("\n");
}

int jianyan() //检验所取数的数量
{
int i,s=0;
for(i=1;i<=n;i++)
if(a[i])s++;
return s;
}
void fun(int t,int k) //主递归函数
{
int i;
if(t>n||jianyan()>=k) return; //递归出口
a[t]=1;
if(jianyan()==k)
print();
else fun(t+1,k);
a[t]=0; //回退继续
fun(t+1,k);
}
int main()
{
int k=0,i,j;
printf("输入n值:");
scanf("%d",&n);
while(k!=n) //取1至n个数
{
k++;
fun(1,k);
}
return 0;
}本回答被提问者和网友采纳
第2个回答  2010-08-04
不管对错,先写一个出来。大家再帮你找错或提意见,这样比较好。
第3个回答  2010-07-31
想学就先自己写
有问题再问

c++得出有n个元素的集合的所有子集?
按照你的要求编写的打印有n个元素的集合的所有子集的C++程序如下(见图)

求用递归法求一个集合的子集的C++代码!!
找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3 的所有组合为:(1)5、4、3 (2)5、4、2 (3)5、4、1 (4)5、3、2 (5)5、3、1 (6)5、2、1 (7)4、3、2 (8)4、3、1 (9)4、2、1 (10)3、2、1 分析所列的10个组合...

用递归求一个集合的所有子集
= 1;diver(str,len,

输出n个整数的所有子集(c++)
f(判断第i+1个数)}

求集合的子集个数
子集元素有1个的有[nC1]子集元素有2个的有[nC2]……子集元素有m个的有[nCm]……子集元素有n-1个的有[nC(n-1)]子集元素有n个的有[nCn]所以一个有限集合内有[nC0]+[nC1]+[nC2]+……+[nCm]+……+[nC(n-1)]+[nCn]根据二项式定理 知[nC0]+[nC1]+[nC2]+……+[nCm]+……...

集合{1,2,3,4}所有子集?
集合中的元素在取出成为一个子集时,有 取与不取两种情况:就是说每一个元素有两种可能 2×2×。。。(n个2)=2^n个子集 【全不取是空集,全取是本身】如果是非空真子集的话,就是2^n-2 如果是真子集的话,就是2^n-1 --- 所以这道题的答案是:2^4=16个。分别是:空集 {1} {...

列举集合{1,2,3}的所有子集
所有子集:∅、{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3}。1、空集是所有集合的子集;2、含有1个元素的子集有:{1}、{2}、{3};3、含有2个元素的子集有:{1,2}、{1,3}、{2,3};4、含有3个元素的子集有:{1,2,3}。设S,T是两个集合,如果S的所...

写出集合1,2,3,4的所有子集,并指出其中的真子集
集合1,2,3,4的所有子集:{1}{2}{3}{4}{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}{1,2,3}{1,2,4 {1,3,4}{2,3,4}{1,2,3,4}共16个。真子集为:∅,{1}{2}{3}{4}{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}{1,...

如何判断一个集合的所有的子集个数?
含有3个元素的子集有{1,2,3}.共有子集8个 子集中分别含1,2,3三个元素中的0个,1个,2个或者3个 分析 根据子集的定义,按照子集元素数目由少到多的顺序写成集合{1,2,3}的所有子集即可.解答 解:集合{1,2,3}的子集为∅,{1},{2},{3},{1,2},{1,3},{2,3}...

列举集合的子集时,空集用不用加花括号?
回答:空集是任何非空集合的子集那么就第一个例子而言就不要括号,而第二个例子需要先知道集合A的子集里有一个就是空集,在这里的空集就是一个元素,就先{a}里面的a一样是一个元素就要加括号。你需要把概念弄清楚

相似回答