抽象深度優先搜尋 k個數的和

2021-09-17 18:13:03 字數 1510 閱讀 8832

先來看乙個非常簡單的問題:

借助 dfs 來解決問題, 對每乙個數, 列舉選或者不選兩種情況, 我們可以用 dfs 思想來完成這樣的列舉過程。

搜素過程中, 用s來記錄當前選擇的數值總和,k用來記錄選擇的數的個數,deep表示當前正在列舉第幾個數是否選擇。

在第一層dfs的時候, 我們可以列舉是否選第乙個數, 如果選第乙個數則讓s加上第乙個數且k加一, dfs 進入下一層; 否則 dfs 直接進入到下一層。

在第二層, 對第二個數做同樣的處理, dfs 的過程中記錄已經選取的數的個數, 如果已經選取了k個數, 判斷s值是否等於sum。對於每一層, 我們都有兩個選擇-------選和不選。 不同的選擇, 都會使得搜素進入完全不同得分支繼續搜素。

下圖是這個搜素過程對應的搜尋樹

如果不選取第i個數, 那麼cnts都不會有變化。

如果選取第i個數,cnt加上 1 ,s加上a[ i ]

對於不同的選擇進行不同的分支搜尋。

dfs(i+1, cnt, s);

dfs(i+1, cnt+1, s+a[i]);

現在處理邊界條件, 邊界條件其實很簡單, 當i == n的時候, 我們已經對所有的數都做出了選擇, 這時候我們來判斷選出來的數的個數是否等於k, 和值是否等於sum

if(i==n)

return;

}

呼叫 dfs 函式, 初始化的時候引數 i,cnt, s都應該初始化成為0。

dfs(0,0,0);
以下為完整**:

#include using namespace std;

int n, k, sum, ans;

int a[40];

void dfs(int i, int cnt, int s)

return;

}dfs(i+1, cnt, s);

dfs(i+1, cnt+1, s+a[i]);

}int main()

ans = 0;

dfs(0,0,0);

cout<

return 0;

}

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

廣度優先搜尋和深度優先搜尋

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...

深度優先搜尋和廣度優先搜尋

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...