AcWing 93. 递归实现组合型枚举【DFS】【递归】

AcWing 93. 递归实现组合型枚举

  • 一、题目链接
  • 二、题目分析
    • (一)算法标签
    • (二)解题思路
  • 三、AC代码
  • 四、其它题解


一、题目链接

AcWing 93. 递归实现组合型枚举
AcWing 93. 递归实现组合型枚举【DFS】【递归】_第1张图片
AcWing 93. 递归实现组合型枚举【DFS】【递归】_第2张图片


二、题目分析

(一)算法标签

DFS 递归

(二)解题思路

枚举完第u(u = 1, 2, 3 … , m)个位置后,第 u + 1 个位置只能从第 u 个位置的数 + 1开始枚举,并且只能枚举到 n - m + u

详细了解搜索类题目(DFS、BFS),请移步DFS BFS 搜索题目归纳


三、AC代码

解法一:

#include 
#include 
#include 

using namespace std;

int n, m;
int state[25];
void dfs(int u)
{
    if (u > m)
    {
        for (int i = 1;i <= m; i ++ )
            printf("%d ", state[i]);
        puts("");
        return;
    }
    for (int i = state[u - 1] + 1; i <= n - m + u; i ++ )
    {
        state[u] = i;
        dfs(u + 1);
        state[u] = 0;
    }
    
}
int main()
{
    cin >> n >> m;
    dfs(1);
    return 0;
}

要不要st数组都可以,因为是按顺序考虑的,所以不用管之前的用到没有
vector存下方案

#include 
#include 
#include 

using namespace std;

const int N = 25;

int state[N];
// bool st[N];
int n, m;

vector<vector<int>> ways;

void dfs(int u)
{
    if (u > m)
    {
        vector<int> way;
        for (int i = 1; i <= m; i ++ )
            way.push_back(state[i]);
        ways.push_back(way);
        return;
    }
    
    for (int i = state[u - 1] + 1; i <= n - m + u; i ++ )
    {
        // if (!st[i])
        // {
            // st[i] = true;
            state[u] = i;
            dfs(u + 1);
            state[u] = 0;
            // st[i] = false;
        // }
    }
}
int main()
{
    cin >> n >> m;
    
    dfs(1);
    
    for (int i = 0; i < ways.size(); i ++ )
    {
        for (int j = 0; j < ways[i].size(); j ++ )
            printf("%d ", ways[i][j]);
        puts("");
    }
    return 0;
}

四、其它题解

AcWing 93. 递归实现组合型枚举

你可能感兴趣的:(搜索,算法,c++,数据结构)