rainyroad

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

常见位运算操作:x>>j&1,判断x二进制下从右往左第j个数是不是1.

                            如果要枚举32个状态,可以把1<<32,每一位代表一个状态

                            以两道递归题为例。

题目1:给你1~n个数,从中选取任意多的数,然后输出所有可能的结果

思路分析:每一个数都面临选与不选两种可能性,所以可以用一个二进制下为n位的数来保存每一个结果,如果第k位是0,则表示数k不选,如果第k位为1,则表示数k被选中。

                  这里保存两种状态,当前要枚举的数是第几个数,还有哪些数已经被枚举过了,这个用一个n位的二进制数实现。并且如果当前数被选进去 ,则将其对应的二进制位置1,state+(1<<cur);

                  如果没有被选进去,则保存的数组仍然是state。下面上代码

#include<iostream>

using namespace std;

int n;

void dfs(int cur,int state)
{
    if(cur==n)
    {
        for(int i=0;i<n;i++)
        {
            if(state>>i&1)
            cout<<i+1<<" ";
        }
        cout<<"\n";
    }
    else
    {
        dfs(cur+1,state);
        dfs(cur+1,state+(1<<cur));
    }
}

int main()
{
       cin>>n;
       dfs(0,0);       
       return 0;                                  
 } 

posted on 2019-01-19 22:37  rainyroad  阅读(127)  评论(0编辑  收藏  举报