【挑戰程式設計競賽第二版 巫澤俊】
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即可。換乙個方式想,從某個狀態開始不斷的轉移狀態直到無法轉移,然後然後回退到前一步的狀態,繼續轉...