Chinaunix首页 | 论坛 | 博客
  • 博客访问: 345413
  • 博文数量: 88
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 885
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 14:50
文章分类

全部博文(88)

文章存档

2010年(88)

我的朋友

分类: C/C++

2010-09-23 15:14:40

有两种方法:
1. 按照位图方法,用一个位图(我代码里用的一个数组)来表示集合,对应的位为1则表示成员存在,为0则不存在,输出地时候遍历位图,输出对应位为1的项。(代码中的SubSet2函数)
2. 思想很简单,每个数字要么在子集中,要么不在子集中,所以我们采取这样的做法,对于原集合中的任意一个数字,我们要么取之,要么不取,用递归实现较方便。(代码中的SubSet函数)


/*
 * Description:
 *          输出一个集合的所有子集。
 * Author  :FinL
 * Language: C++
 * Date    : 2010-09-23
 */
#include
using namespace std;


void SubSet(int* arr,int num,int n,int *include)
{
if(num==n)
{
for(int i=0;i
{
if(include[i])
cout<
}
cout<
}
else
{
include[num]=0;
SubSet(arr,num+1,n,include);
include[num]=1;
SubSet(arr,num+1,n,include);
}
}


void SubSet2(int *arr,int n,int *include)
{
int sum=0,i=0,k=1;
while(i++
k  *= 2;
while(sum
{
int m=0,tmp=sum;
while(m
{
include[m]=tmp%2;
tmp /=2;
if(include[m])
cout<
if(0==tmp)
break;
m++;
}
cout<
sum++;
}
}



int main()
{
// int arr[]={1,2,4,6,3,7,97,46,32,25,12,11};
int arr[]={1,2,3,4};
int n;

n=sizeof(arr)/sizeof(arr[0]);
int *include =new int[n];
memset(include,0,n*sizeof(int));

// SubSet(arr,0,n,include);
SubSet2(arr,n,include);
return 0;
}
阅读(2137) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-26 15:46:11

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com