一.深度優先搜尋
列舉所有完整路徑以遍歷所有情況;
實現方式:遞迴 / 非遞迴;
示例一:
//無效終點:
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...
深度優先搜尋筆記
深度優先搜尋按照深度優先的方式進行搜尋,通俗點就是 一條路走到黑 注意,這裡的搜尋不是指的我們平時在檔案或者網路上查詢的某些資訊,搜尋是一種窮舉的方式,把所以可行的方案都列舉出來,不斷去嘗試,直到找到問題的解。深度優先搜尋和遞迴的區別是 深度優先搜尋是一種演算法,注重的是思想 遞迴是一種基於程式語言...