• 算法进阶指南(递归)--- 递归实现指数型枚举


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

    普通版:

    #include <iostream>
    using namespace std;
    
    int n;
    int a[20];
    bool vis[20];
    
    // 当前枚举到第pos个坑, 上一个坑填的是start-1,这次只能从start开始找数填, 一共要填tar个坑
    void dfs(int pos, int start, int tar) {
    	if(pos == tar+1) {
    		for(int i = 1; i <= tar; i++) cout<<a[i]<<" ";
    		cout<<endl;
    		return ;
    	}
    	for(int i = start; i <= n; i++) {
    		vis[i]=true;
    		a[pos]=i;
    		dfs(pos+1,i+1,tar);
    		vis[i]=false;
    	}
    
    }
    
    int main() {
    	cout << endl;
    	cin >> n;
    	for (int i = 1; i <= n; i ++ )
    		dfs(1, 1, i);
    	return 0;
    }
    
    

    动态数组版:

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    
    int n;
    vector<int > chosen;
    
    void dfs(int x) {
    	if(x == n+1) {
    		for(int i=0; i<chosen.size(); i++) {
    			cout<<chosen[i]<<" ";
    		}
    		puts("");
    		return ;
    	}
    	//不选择x这个值
    	dfs(x+1);
    
    	//选择x这个值
    	chosen.push_back(x);
    	dfs(x+1);
    	chosen.pop_back();
    
    }
    int main() {
    	cin >> n;
    	dfs(1);
    	return 0;
    }
    

    位运算版:

    #include<iostream>
    
    using namespace std;
    
    
    int n;
    
    //pos是当前枚举的这个数,tar是记录哪些值被选
    void dfs(int pos,int tar) {
    
    	if(pos == n) {
    		for(int i = 0; i<n; i++) {
    			if(tar>>i&1) cout<<i+1<<" ";
    		}
    		cout<<"
    ";
    		return ;
    	}
    	//不选择pos这个值
    	dfs(pos+1,tar);
    	//选择pos这个值
    	dfs(pos+1,tar|(1 << pos));
    
    }
    int main() {
    	cin >> n;
    	dfs(0,0);
    	return 0;
    }
    
  • 相关阅读:
    BZOJ3065(替罪羊树套线段树)
    BZOJ3052(树上带修莫队)
    BZOJ1095(动态点分治+堆)
    NOIWC颓废记
    BZOJ2125 最短路
    Simpson积分(BZOJ2178)
    BZOJ4555 [Tjoi2016&Heoi2016]求和
    NTT+多项式求逆+多项式开方(BZOJ3625)
    Miller-Rabin,Pollard-Rho(BZOJ3667)
    单纯形求解线性规划(BZOJ1061)
  • 原文地址:https://www.cnblogs.com/bingers/p/13192248.html
Copyright © 2020-2023  润新知