有如下问题:
输入一个任意正整数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可以用循环写
----------------解决方案--------------------------------------------------------
实现里面2^n可以用循环写
2^n 就是 1<<n
----------------解决方案--------------------------------------------------------