求集合的子集

来源:互联网 发布:电脑如何装mac系统 编辑:程序博客网 时间:2024/05/22 05:30
输出一个集合的所有子集,也就是一个集合的所有组合(你想到了什么?)。也有递归的解法,这里的递归思想就是:n个数,每个数取或不取,          f(判断第i个数)     {                递归的终止:         若n个数都判断完(i>=n),即判断完每个元素是否取在这个集合中,输出刚才所取的数,返回。         递归的循环:                否则:                    此集合不取第i个数,                   f(判断第i+1个数)                     此集合取第i个数,                   f(判断第i+1个数)     }   #include  <stdio.h> void  subset  (char  *  set,  int  *  mask,  int  size,  int  c) { int i;if  (c  ==  size)  // c和size相等时找到子集,并打印子集{ /* we  get  a  result,  output  it  */printf  ( "{ "); for  (i  =  0;  i  <  size;  i++)if  (mask[i]  ==  1) printf  ( "%c  ",  set[i]); printf  ( "}\n "); } else // 否则, 将求子集分割为求含有第C个元素的子集和没有含第C个元素的子集, 这样反复递归{ /* select  the  cth  element  */mask[c]  =  1; /* process  the  remainning  elements  */subset  (set,  mask,  size,  c  +  1); /* unselect  the  cth  element  */mask[c]  =  0; /* process  the  remaining  elements  */subset  (set,  mask,  size,  c  +  1); } } //你要注意的是mask的作用, 它起到一个屏蔽的作用, 当mask==0时,不打印int  main  () { char  set[]  =  { 'a', 'b', 'c','d'}; int  mask[4]; subset  (set,  mask,  4,  0); getch();//可要可不要return  0; } 

0 0
原创粉丝点击