zoukankan      html  css  js  c++  java
  • 【基础】枚举学习笔记

    枚举形式

    按照状态空间的规模大小,有如下几种常见的枚举和遍历形式:
    1、多项式->循环,递推
    2、指数->递归,位运算

    //从1~n这n个数中随机取多个,输出可能的方案
    vector<int>chosen;
    void calc(int x){
        if(x==n+1){//问题边界
            for(int i = 0; i < chosen.size(); i++)
                cout<<chosen[i]<<' ';
            cout<<'
    ';
            return ;
        }
        //不选x
        calc(x+1);
        //选x
        chosen.push_back(x);
        calc(x+1);
        chosen.pop_back();
    }
    int main(){
        calc(1);
    }

    3、组合->递归+剪枝

    //从1~n这n个数中随机选出m个,输出可能的方案
    vector<int>chosen;
    void calc(int x){
        //剪枝
        if(chosen.size()>m || chosen.size()+(n-x+1)<m){
            return ;
        }
        if(x==n+1){//问题边界
            for(int i = 0; i < chosen.size(); i++)
                cout<<chosen[i]<<' ';
            cout<<'
    ';
            return ;
        }
        //不选x
        calc(x+1);
        //选x
        chosen.push_back(x);
        calc(x+1);
        chosen.pop_back();
    }
    int main(){
        calc(1);
    }

    4、排列->递归

    //从1~n这n个整数随机打乱,输出所有可能的次序
    int a[20], vis[20];
    void calc(int k){
        if(k == n+1){
            for(int i = 1; i <= n; i++)
                cout<<a[i]<<' ';
            cout<<'
    ';
            return ;
        }
        for(int i = 1; i <= n; i++){
            if(vis[i])continue;
            a[k] = i;
            vis[i] = 1;
            calc(k+1);
            vis[i] = 0;
            a[k] = 0;//可省略
        }
    }
  • 相关阅读:
    Redis 安全
    Redis 数据备份与恢复
    Redis 服务器
    Redis 连接
    Redis 脚本
    Linux中使用netstat命令的基本操作,排查端口号的占用情况
    ElasticSearch 常用查询语句
    GO代码风格指南 Uber Go (转载)
    coding 注意事项(总结中)
    Byte字节
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444806.html
Copyright © 2011-2022 走看看