oi筆記——抽象的深度優先搜索

oi筆記——抽象的深度優先搜索

例題:

\(N個數中選K個數,選出的和要爲sum\)ios

例題分析:

對於每一個點,咱們能夠按「選」和「不選」進行搜索,如圖:
alt算法

或者01揹包求解spa

求解示例(抽象深搜版代碼)

#include <iostream>
using namespace std;
int n, k, sum, ans;
int a[40];
void dfs(int i,int cnt,int s) {
    if(i==n) {
        if(cnt==k&&s==sum) {
            ans++;
        }
        return;
    }
    dfs(i+1,cnt,s);
    dfs(i+1,cnt+1,s+a[i]);
}
int main() {
    cin >> n >> k >> sum;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    ans = 0;
    dfs(0,0,0);
    cout<<ans<<endl;
    return 0;
}

定義:
前面說過,dfs 看起來是運行在圖上的搜索算法,而前一節給你們展現的 dfs 過程,咱們沒有看到圖的存在,這就是抽象形式的 dfs 的特色。咱們能夠根據搜索狀態構建一張抽象的圖,圖上的一個頂點就是一個狀態,而圖上的邊就是狀態之間的轉移關係(進一步搜索或回溯)。雖然 dfs 是在這張抽象的圖上進行的,但咱們沒必要把這張圖真正地創建出來。code

相關文章
相關標籤/搜索