搜索枚举

Posted littlefrog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索枚举相关的知识,希望对你有一定的参考价值。

搜索枚举,就是用搜索代替枚举,可以使算法时间复杂度降低,也可以帮助解决很多枚举(暴力)的算法无法解决(或很慢才能解决)的问题。

基本搜索枚举

有如下方程:[a_1 x_1 + a_2 x_2 + a_3 x_3 + cdots + a_n x_n = 0] ((2 le n le 10, 1 le a_i le 5, -2 le x_i le 2, x_i in mathbb{Z}))

求其解的总数。

int ans = 0;
void dfs(int dep, int sum) {
    if(dep == n) {
        if (sum == 0){
            ans++;
        }
        return ;
    }
    for (int i = -2; i <= 2; i++) {
        dfs(dep + 1, sum + a[dep] * i);
    }
}

(搜索枚举解法)

排列数

题面链接: https://www.luogu.com.cn/problem/P1706 (洛谷)

#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n;
int per[N];
bool vis[N];
void dfs (int dep) {
    if(dep==n) {
        for(int i = 0;i<n;++i) {
            cout<<setw(5)<<per[i]<<setw(5);
        }
        cout<<endl;
        return;
    }
    for (int i = 1;i<=n;++i) {
        if(vis[i]) {
            continue;
        }
        vis[i] = 1;
        per[dep] = i;
        dfs(dep+1);
        vis[i] = 0;
    }
}

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

组合数

题面链接: https://paste.ubuntu.com/p/T5fxWJPCVk/(云剪贴板)

#include <iostream>
using namespace std;
const int N = 15;
int n, k;
int comb[N];
void dfs(int x, int dep) {
    if(dep == k) {
        for (int i = 0; i < k; i++) {
          cout << comb[i] ;
        }
        cout << endl;
        return;
    }
    if(x == 0) {
        return ;
    }
    comb[dep] = x;
    dfs(x - 1, dep + 1);
    dfs(x - 1, dep);
}

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

以上是关于搜索枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BottomNavigationView 的片段上打开搜索界面?

Leetcode 128 最长连续序列

26个jQuery代码片段使用技巧

PAT1049-----枚举法,找规律题,注意降低时间复杂度

Xcode 输入时 搜索代码块前面标记的字母含义

《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片