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

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

 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 }

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

posted on 2013-01-03 20:10  NeilHappy  阅读(206)  评论(0编辑  收藏  举报