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

设计一个减一算法,生成一个n元素集合的所有子集(包括空集和本身)。例如一个集合{a,b,c,d},可分成两类集合:1.不包括元素a的集合(即集合{b,c,d}的所有子集)... 设计一个减一算法,生成一个n元素集合的所有子集(包括空集和本身)。

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

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

谢谢各位,好的话,还会有加分。
展开
 我来答
liu890421
2010-08-03 · TA获得超过202个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:190万
展开全部
这个程序必然要使用递归来做。当然不用递归的话,编程复杂度高。另外不要认为递归降低效率,呵呵
比如你求一个数组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数组
}

程序超简单的说,我就不详细写了,呵呵,算法你要明白
xy_dilemma
推荐于2018-12-12 · TA获得超过135个赞
知道答主
回答量:76
采纳率:0%
帮助的人:0
展开全部
#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;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友385ba49
2010-08-04 · 超过17用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:47.8万
展开全部
不管对错,先写一个出来。大家再帮你找错或提意见,这样比较好。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
warmwormn
2010-07-31 · TA获得超过737个赞
知道小有建树答主
回答量:1694
采纳率:0%
帮助的人:1328万
展开全部
想学就先自己写
有问题再问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式