先來看乙個非常簡單的問題:
借助 dfs 來解決問題, 對每乙個數, 列舉選或者不選兩種情況, 我們可以用 dfs 思想來完成這樣的列舉過程。
搜素過程中, 用s來記錄當前選擇的數值總和,k用來記錄選擇的數的個數,deep表示當前正在列舉第幾個數是否選擇。
在第一層dfs的時候, 我們可以列舉是否選第乙個數, 如果選第乙個數則讓s加上第乙個數且k加一, dfs 進入下一層; 否則 dfs 直接進入到下一層。
在第二層, 對第二個數做同樣的處理, dfs 的過程中記錄已經選取的數的個數, 如果已經選取了k個數, 判斷s值是否等於sum。對於每一層, 我們都有兩個選擇-------選和不選。 不同的選擇, 都會使得搜素進入完全不同得分支繼續搜素。
下圖是這個搜素過程對應的搜尋樹:
如果不選取第i個數, 那麼cnt和s都不會有變化。
如果選取第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...