当前位置: 代码迷 >> C语言 >> [求助]请教一个算法或程序
  详细解决方案

[求助]请教一个算法或程序

热度:125   发布时间:2006-11-24 00:55:14.0
[求助]请教一个算法或程序


有如下问题:

输入一个任意正整数n,由小于该整数的所有非负整数构成的一个数列{0,1,2,3,n-1},
要求输出该数列的所有子集。
例如:输入3
即要输出:{0},{1},{2},{0,1},{0,2},{1,2},{0,1,2}

请指点,谢谢!

搜索更多相关的解决方案: 算法  整数  

----------------解决方案--------------------------------------------------------
应该是组合问题
----------------解决方案--------------------------------------------------------

回朔可以吧,效率很低.
a[i]=1;表示i被选中.
a[i]=0表示i没有被选种.
void Backtract(int t)
{
if(t>n)
{
判断输出a[i]中为1的i.
}
for(int i=0;i<n;i++)
{
a[t]=i;
if(当前i与前面被选中要大)
Backtract(t+1);
}
}


----------------解决方案--------------------------------------------------------
很难的问题,我也很想知道答案.
----------------解决方案--------------------------------------------------------

斑竹的算法我有点晕:)
此题为应聘软件工程师的一道笔试题,我把它列出来,请大家多出出主意,有没有更好的容易理解的算法/


----------------解决方案--------------------------------------------------------

列出所有子集的方法有很多

下边介绍一种用二进制对应关系列出所有字集的方法:
拿{1,2,3}为例

{} 对应000 //0表示不在集合中,1表示在
{1} 对应100
{2} 010
{3} 001
{1,2} 110
{1,3} 101
{2,3} 011
{1,2,3} 111

所以{1,2,3}的所有字集与3位二进制数是对应的.
也即产生二进制数,就可以产生所有字集.



----------------解决方案--------------------------------------------------------
我很喜欢6楼的方法~~~~~很好的方法~~实现起来也简单~
----------------解决方案--------------------------------------------------------
像楼上一样的,回朔法就是这个样子.
----------------解决方案--------------------------------------------------------
斑竹的代码偶看是看懂了,不过我自己实现的时候没用回朔.
用了一个十进制转二进制的方法(带余除2).
cin>>n;
for(i=0;i<2^n;i++){//每次循环为一个子集
while(i){
if(i%2)cout<<t;
t++;
i=i/2;
}//用二进制判断
}

实现里面2^n可以用循环写
----------------解决方案--------------------------------------------------------
以下是引用剑风曲在2006-11-26 16:47:08的发言:


实现里面2^n可以用循环写

2^n 就是 1<<n


----------------解决方案--------------------------------------------------------
  相关解决方案