从零开始学算法-Day3

//2020.4.22 第三天,学习的动力下降了
这也太难了吧。。。

题目:递归实现指数型枚举

题目描述:从1∼n这 n (n≤16)个整数中随机选取任意多个,输出所有可能的选择方案。

链接:https://ac.nowcoder.com/acm/contest/998/A
来源:牛客网

求解之路:

题目咋一看,不会。。。仔细一看,真的不会啊。。太难了
没办法啊,还是得学。
道理怎么办呢?那就得去看别人的代码了。。。

#include<iostream>
using namespace std;
int n;
void dfs(int u,int state)
{  //u用于记录递归次数 
//state用于记录状态 
    if(u==n)
    {
        for(int i=0;i<n;i++)
        if(state>>i&1)
        cout<<i+1<<" ";
        cout<<endl;
    return;
    }

    dfs(u+1,state);//表示不将第u位置1
    dfs(u+1,state|1<<u);//将第u位置1
    /* 最终将置成
    3->100
    2->010
    2 3->110
    1->001
    1 3->101
    1 2->011
    1 2 3->111
    */

}
int main(){
    cin>>n;
    dfs(0,0);//本题有明显的顺序,可以用dfs搜索
    //应该有两个变量一个用于记录递归的次数,以便
    //在边界的条件时能及时停下来
    //另一个用于记录不同的状态
    return 0; 
}

今天真的不行了,看不明白啊,太晚了,明天再捋捋。。

//2020.4.23 今天继续来搞
图片说明
画了个流程图,一下子就把代码理解了。

<< 的优先级比| 高,运算的时候会先进行<<运算。

这道题用非递归就也能解出来了

#include <iostream>
using namespace std;

int main (){
    int n;
    cin >> n;
    for(int sta = 0; sta < (1 << n);sta++){
        for(int i = 0;i < n; i ++)
            if(sta >> i & 1)
                cout << i+1 << " ";
        cout << endl;
    }
    return  0;
} 

 总结:

真的很难,真的需要慢慢学!!!
递归代码来源:https://blog.csdn.net/qq_42635159/article/details/97116622

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务