递归实现指数型枚举

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


通过画图模拟可以看到,若我们选好了 1 2 3, 我们可以再退到是否选择3的情况,因此选与不选这样实现:

  st[u] = true;
  dfs(u + 1);
  st[u] = false;
  dfs(u + 1);

code:

#include <iostream>

using namespace std;

const int N = 20;

bool st[N];

int n;

void dfs(int u){
    if(u > n){
        for (int i = 1; i <= n; i ++)
            if (st[i])
                cout << i << ' ';
        cout << endl;
        return;
    }
    st[u] = true;
    dfs(u + 1);
    st[u] = false;
    dfs(u + 1);
}

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

递归实现排列型枚举(全排列)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 20;

int p[N];
bool st[N];

int n;

void dfs(int u){
    if (u > n){
        for (int i = 1; i <= n; i ++){
            cout << p[i] << " ";
        }
        cout << endl;        
    }
    for (int i = 1; i <= n; i ++){
        if (!st[i]){
            p[u] = i;
            st[i] = 1;
            dfs(u + 1);
            st[i] = 0;
        }
    }
}

int main(){
    cin >> n;
    dfs(1);
    return 0;
}
posted @ 2022-02-04 20:54  Gsding  阅读(64)  评论(0)    收藏  举报