求一个产生子集的方法

maple604 2008-03-21 07:50:02
一个由N个项组成的集合,应该怎么编程产生它的所有子集啊
请大家帮忙
...全文
68 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2008-03-21
  • 打赏
  • 举报
回复

//输出集合{0,1,2,3,....,n-1}的所有子集
#include <stdio.h>

#define MAX_N 5

int g_arr[MAX_N] = {0};
__int64 g_cnt = 0;

void Recur(int* arr, int arr_size, int req_cnt)
{
if (req_cnt > 0)
{
//数据没有选够,从剩下的数据中继续选

//先选中最小的
arr[0] = 1;
//然后从剩下的arr_size - 1个数据中选req_cnt-1个数据
Recur(arr+1, arr_size - 1, req_cnt-1);

//回溯一下,跳过刚才选的那个最小数的情况
arr[0] = 0;
if ((arr_size - 1) >= (req_cnt ))
{
Recur(arr+1, arr_size - 1, req_cnt);
}
}
else
{
//找到一组完整数据
++g_cnt;

//输出组合
for(int i=0; i<MAX_N; i++)
{
if (g_arr[i] == 1)
{
printf("%d\t", i);
}
}
printf("\n");
}
}

int main(int argc, char* argv[])
{
for(int i=1; i<=MAX_N; i++)
Recur(g_arr, MAX_N, i);

printf("total group = %I64u\n", g_cnt);
return 0;
}


输出MAX_N=5的情况:
0
1
2
3
4
0 1
0 2
0 3
0 4
1 2
1 3
1 4
2 3
2 4
3 4
0 1 2
0 1 3
0 1 4
0 2 3
0 2 4
0 3 4
1 2 3
1 2 4
1 3 4
2 3 4
0 1 2 3
0 1 2 4
0 1 3 4
0 2 3 4
1 2 3 4
0 1 2 3 4
total group = 31
ryfdizuo 2008-03-21
  • 打赏
  • 举报
回复
c语言版里面有的,
abupie 2008-03-21
  • 打赏
  • 举报
回复
遍例。

#include <stdio.h>
#include <stdlib.h>

int zuoyi(int n)
{
int i = 1<<n;
return i-1;
}
int main()
{
int k[100];
int p = 0, q,i,j;
int n;
scanf("%d",&n);
p = zuoyi(n);
for ( i = 0; i <= p; i++ )
{
j = i;
for ( q = 0; j > 0; q++ )
{
k[q] = j%2;
j = j/2;
}
printf(" { ");
while (q--)
{
if ( k[q] ) printf("%d ",q+1);
}
printf("}\n");
}
return 0;
}
Supper_Jerry 2008-03-21
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080320/22/256fd339-2a04-4c70-8009-a6c62793636e.html
看看这个应该有帮助

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧