一个数组的所有子集

2016-08-16  本文已影响102人  EternalSunLhx

求子集问题就是求组合问题。数组中的n个数可以用n个二进制位表示,当某一位为1表示选择对应的数,为0表示不选择对应的数。

vector<vector<int> > subsets(vector<int> &S,int n)  
{  
   //n个数有0~max-1即2^n中组合,1<<n表示2^n  
    int max = 1<<n;  
    vector<vector<int> >result;  
    for(int i = 0;i < max;i++)  
    {  
        vector<int> temp;  
        int idx = 0;  
        int j = i;  
        while(j > 0)  
        {  
            //判断最后一位是否为1,若为1则将对应数加入到当前组合中  
            if(j&1)  
            {  
                temp.push_back(S[idx]);  
            }  
            idx++;  
            //判断了这一位是否为1后要右移  
            j = j>>1;  
        }  
        //判断完了一种组合,加入到结果集中  
        result.push_back(temp);  
    }  
    return result;  
}
上一篇 下一篇

猜你喜欢

热点阅读