《演算法筆記》8 1 深度優先搜尋

2021-10-05 10:31:06 字數 2160 閱讀 8269

一.深度優先搜尋

列舉所有完整路徑以遍歷所有情況;

實現方式:遞迴 / 非遞迴;

示例一:

//無效終點:

if(index == n || nowk > k || sum > x)

return

;//選第 index 個數:

temp.

push_back

(s[index]);

dfs(index +

1, nowk +

1, sum + s[index]

, sumsqu + s[index]

* s[index]);

temp.

pop_back()

;//不選第 index 個數:

dfs(index +

1, nowk, sum, sumsqu)

;}注意:

1).選第 index 個數時,先把 s[index] 放進 temp 裡,進入「選 s[index] 」這條分支;當這條分支結束時,把 s[index] 從 temp 中拿出來,使它不會影響「不選 s[index] 」這條分支;

2).兩個岔路位置不可以顛倒,為什麼?

(2).

假設題目中的 n 個整數均可以被選擇多次,則將dfs(index + 1, nowk + 1, sum + s[index], sumsqu + s[index] * s[index]);替換成dfs(index, nowk + 1, sum + s[index], sumsqu + s[index] * s[index]);即可;

二.題目

1.pat a1103

思路:和示例二(2)一樣;

注意:1).保證底數字典序最大:讓 index 從小到大遍歷;

2).不能從 n 開始遍歷,會超時;必須從 n ^ p <= n 的數處開始(比如169 5 2,index = 13);計算 n 的方法不能是 pow(n, 1 / p),因為 1 / p 會是0;

**:

#include

#include

#include

using

namespace std;

const

int maxn =

420;

int n, k, p;

vector<

int> ans;

vector<

int> temp;

int maxsumfac =0;

void

dfs(

int index,

int nowk,

int sum,

int sumfac)

return;}

if(sum > n || nowk > k || index -

1<0)

return

; temp.

push_back

(index)

;dfs

(index, nowk +

1, sum +

pow(index, p)

, sumfac + index)

; temp.

pop_back()

;dfs

(index -

1, nowk, sum, sumfac);}

intmain()

n = n -1;

dfs(n,0,

0,0)

;if(ans.

size()

==0)printf

("impossible\n");

else

}return0;

}

演算法筆記 深度優先搜尋 DFS

深度優先搜尋 depth first search,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...

《演算法筆記》深度優先搜尋DFS

問題 有n件物品,每件重量為w i 價值為c i 放進容量為v的揹包中。問 能放進揹包的物品的最大價值?分析 1.每件物品 選 不選,兩種狀態 迷宮的岔道口 2.超過v,邊界 迷宮的死胡同 3.到達邊界,返回最近的岔道口 4.dfs需要記錄 5.兩種轉移狀態 dfs index 1,sumw w i...

深度優先搜尋筆記

深度優先搜尋按照深度優先的方式進行搜尋,通俗點就是 一條路走到黑 注意,這裡的搜尋不是指的我們平時在檔案或者網路上查詢的某些資訊,搜尋是一種窮舉的方式,把所以可行的方案都列舉出來,不斷去嘗試,直到找到問題的解。深度優先搜尋和遞迴的區別是 深度優先搜尋是一種演算法,注重的是思想 遞迴是一種基於程式語言...