位运算求子集树

位运算求子集树
以前求子集树都是用回溯法,
今天在topcoder做SRM时学到一种求子集树的新方法:位运算。
第一重循环是枚举所有子集,共2^n个,即1 << n个
第二重循环求集合所有j个元素的值,0或1。
求一下1 & (1 << j)的值就可以知道它的原理。
#include < iostream >
using 
Namespace std namespace std;
const int n = 4;
int x[n];
//回溯法
void backtrack(
int t)
{
    
if(t >= n)
    {
        
for(int i = 0; i < n; i++)
            cout
<<x[i];
        cout
<<endl;
    }
    
else
    {
        
for(int i = 0; i <= 1; i++)
        {
            x[t] 
= i;
            backtrack(t 
+ 1);
        }
    }
}
//位运算
void bitOperate()
{
    
for(int i = 0; i < (1 << n); i++)
    {
        
for(int j = 0; j < n; j++)
        {
            
if( (i & (1 << j) ) == 0)
                x[j] 
= 0;
            
else
                x[j] 
= 1;
        }
        
for(int j = 0; j < n; j++)
            cout
<<x[j];
        cout
<<endl;
    }
}
int main()
{
    backtrack(
0);
    cout
<<endl;
    bitOperate();
    
return 0;
}

你可能感兴趣的:(位运算求子集树)