深度優先演算法學習 案例

2021-07-27 09:54:24 字數 992 閱讀 2728

【挑戰程式設計競賽第二版 巫澤俊】

1.部分和問題

給定整數a1、a2、…、an,判斷是否可以從中選出若干數,使他們的和恰好為k。

限制條件: 1≤

n⩽20 −10

8≤ai

≤108

−108≤

k≤108

題解:利用深度優先演算法,分情況計算下去,遞迴。

樣例 輸入:

n=4

a= k=15

輸出:

no

#include 

#include

#include

#include

int a[100000001];

int n,k;

bool dfs(int i,int sum)

int main()

2.lake counting(poj no.2386)

有乙個大小為n*m的園子,雨後積起了。八連通的積水被認為是連線在一起的,試求園子裡總共有多少水窪。(八連通指的是下圖中相對w的*的部分)

限制條件 n,

題解:因為要計算水窪的數量,而且連線在一起的積水算為乙個,因此可以利用深度優先,將連線在一起的都一起標記出來,且出去四周,都有8個方向,兩個for迴圈即可實現。

void dfs(int x,int y)

return ;

}void solve()

printf("%d\n",sum);

}

總結:深度優先演算法可以用在挺多方面的,感覺最主要的還是遞迴的時候,將乙個個情況都列舉出來。

演算法學習 深度優先搜尋

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。廣度優先搜尋 bfs 是按照乙個樹的層次來完成搜尋的...

演算法學習 4 1 深度優先搜尋

深度優先搜尋演算法的基本模型如下 void dfs int step 返回 深度優先搜尋的關鍵在於解決 當下該如何做 下一步如何做可以遞迴呼叫當下該如何做。例如 有n張牌,輸出牌的可能排列的順序 include int a 10 book 10 n void dfs int step step表示現...

演算法學習 看看深度優先搜尋演算法

先看一題 給定整數a1,a2,a3 an,判斷是否可以從中選出若干數,使他們的和恰好為k。那麼,現在分析一下問題的需求。只需從a1開始按順序決定每個數加或者不加,在管不n個數都決定後在判斷他們的和是否為k即可。換乙個方式想,從某個狀態開始不斷的轉移狀態直到無法轉移,然後然後回退到前一步的狀態,繼續轉...