列出所有子集----------2013年1月3日

       问题描述:列出一个集合的所有子集,包括空子集合。

       我的思路:回溯法的一种思路就是生成一颗子集树,而一个集合中的元素,要么存在于子集中,要么不存在,所以这又特殊化成一颗二叉树了。每当到达二叉树的底端时,就打印一次。很容易写出如下的代码:

 1 #include <stdio.h>
 2 #define MAX 1000
 3 
 4 int n=3;  //the number of the set elements
 5 int set[MAX]={1,2,3};
 6 int count=0;//the number of the subset.
 7 
 8 void DFS(int level);
 9 void print_set();
10 
11 int main()
12 {
13     DFS(0);
14     return 0;
15 }
16 
17 void DFS(int level)
18 {
19     if(level==n)
20     {
21         print_set();
22         return ;
23     }
24     int save=set[level];
25     set[level]=0;
26     int index=0;
27     for(index=0;index<2;index++)
28     {
29         DFS(level+1);
30         set[level]=save;
31     }
32 
33 }
34 
35 void print_set()
36 {
37     int index;
38     count++;
39     printf("%d: {",count);
40     for(index=0;index<n;index++)
41     {
42         if(set[index]!=0) 
43             printf("%d ",set[index]);
44     }
45     printf("}\n");
46 }

       如果你觉得我的文章对你有帮助,请推荐一下,非常感谢!

转载于:https://www.cnblogs.com/NeilHappy/archive/2013/01/03/2843295.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值