每日一题——递归/非递归实现组合型枚举

题目

递归实现组合型枚举

题解

可以参考上一题的递归代码,思路是一样的,也是拿个数组存储是否选了该位,多了一个参数记录选了几个,若选了cnt+1,否则直接cnt不变化。
注意观察递归从非递归是如何变化的。

参考代码(递归)

#include<iostream>
using namespace std;
const int N = 25;
int n, m;
bool st[N];
void dfs(int u, int cnt){
    if(u == n + 1 && cnt == m){
        for(int i = 1; i <= n; i ++) 
            if(st[i]) cout << i << " ";
        puts("");
        return;
    }
    if(u > n) return;
    st[u] = true;
    dfs(u + 1, cnt + 1);
    st[u] = false;
    dfs(u + 1, cnt);
}
int main(){
    cin >> n >> m;
    dfs(1,0);
    return 0;
}

参考代码(递归)

#include <iostream>

using namespace std;

int n, m;

void dfs(int u, int sum, int state)
{
    if ( sum + n - u < m ) return;
    if (sum == m)
    {
        for (int i = 0; i < n; i ++ )
            if (state >> i & 1)
                cout << i + 1 << ' ';
        cout << endl;
        return;
    }

    dfs(u + 1, sum + 1, state | 1 << u );
    dfs(u + 1, sum, state);
}

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

参考代码(非递归)

#include<iostream>
#include<stack>
using namespace std;
int n, m;
struct State{
    int pos, u, sum, state;
};
/*
void dfs(int u, int sum, int state)
{
    # 0:
    if ( sum + n - u < m ) return;
    if (sum == m)
    {
        for (int i = 0; i < n; i ++ )
            if (state >> i & 1)
                cout << i + 1 << ' ';
        cout << endl;
        return;
    }
    dfs(u + 1, sum + 1, state | 1 << u );
    # 1:
    dfs(u + 1, sum, state);
    # 2:
}
*/
int main()
{
    cin >> n >> m;
    stack<State> stk;
    stk.push({0, 0, 0, 0});
    while(stk.size()){
        auto t = stk.top();
        stk.pop();
        if(t.pos == 0){
            if ( t.sum + n - t.u < m ) continue;
            if (t.sum == m)
            {
                for (int i = 0; i < n; i ++ )
                    if (t.state >> i & 1)
                        cout << i + 1 << ' ';
                cout << endl;
                continue;
            }
            t.pos = 1;
            stk.push(t);
            stk.push({0, t.u + 1, t.sum + 1, t.state | 1 << t.u });
        }else if(t.pos == 1){
            t.pos = 2;
            stk.push(t);
            stk.push({0, t.u + 1, t.sum, t.state});
        }else continue;
    }
//     dfs(0, 0, 0);
    return 0;
}
posted @ 2025-03-05 19:12  PZnwbh  阅读(17)  评论(0)    收藏  举报