深度優先搜尋是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。使用遞迴可以很好的實現深度優先遍歷,因此,只能說遞迴是實現深度優先遍歷的一種實現方式。
給定乙個序列,列舉這個序列所有的子串行
例如子串行包含,,,,,,
選擇最優子串行,使它的某個特徵是所有子串行中最優的。
這個問題也就是從n個整數中,選擇k個數的所有方案。
n件物品,重量w[i]
,價值c[i]
,選出若干,使總重量不超過v,找出價值最大的值
思路
使用dfs遍歷判斷
結束條件,所有的可能序列遍歷一遍
岔路口分支:選擇當前物品,或者不選擇當前物品。
**
#include
const
int maxn =20;
int w[maxn]
,c[maxn]
;int n,v;
int maxc =0;
void
dfs(
int index,
int sumw,
int sumc)
return
;//即使不是最大的maxc也要return 出去
}dfs
(index +
1,sumw,sumc)
;dfs
(index +
1,sumw+w[index]
,sumc+c[index]);
//注意下標的差1
改進(剪枝)
原先直接加入當前物品,也不管不顧是否已經超出了總重量,
現在在加入之前,提前加入判斷條件
#include
const
int maxn =20;
int w[maxn]
,c[maxn]
;int n,v;
int maxc =0;
void
dfs(
int index,
int sumw,
int sumc)
dfs(index +
1,sumw,sumc);if
(sumw+w[index]
<= v)
}int
main()
for(
int i =
0; i
)dfs(0
,0,0
);printf
("%d\n"
,maxc)
;return0;
}
n個整數中選擇k個數,使得整數和恰好等於給定的整數x,如果有多種方案,選擇平方和最大。
這裡加入了如何儲存最優方案,先用乙個temp用來存放該過程的乙個序列,如果是當前最優,則交給ans
#include
#include
using
namespace std;
const
int maxn =20;
int w[maxn]
;int n,k,x;
int maxseq =0;
vector<
int> temp,ans;
void
dfs(
int index,
int nowk,
int sum,
int sumseq)
return
;//即使不是最大的maxc也要return 出去}if
(index == n||nowk> k ||sum > x)
//選擇當前的
temp.
push_back
(w[index]);
dfs(index +
1,nowk +
1,sum +w [index]
,sumseq + w[index]
* w[index]);
temp.
pop_back()
;dfs
(index +
1,nowk ,sum ,sumseq)
;//不選擇
}int
main()
dfs(0,
0,0,
0);for
(auto it = ans.
begin()
;it!=ans.
end(
);it++
)printf
("\n");
printf
("%d\n"
,maxseq)
;return0;
}
深度優先遍歷DFS
本文章 中的圖用鄰接矩陣來表示,所以演算法複雜度為o v 2 如果用鄰接表來表示,那麼演算法的複雜度為o v e dfs可用來判斷圖中是否有環,展現無向圖中的連通分支。通過dfs,形成乙個由多棵深度優先樹所組成的深度優先森林。將原先圖中的邊新增到該森林之後,可以將所有邊定義為以下四類 1.樹邊 森林...
如何實現深度優先遍歷(DFS)
dfs實現步驟如下 訪問頂點v,並標記v已經訪問 查詢v的第乙個鄰接頂點w 若w存在,則繼續執行,否則演算法結束 若w未被訪問,則使用dfs遞迴訪問w 查詢v的下乙個鄰接節點,並記為w,轉到步驟 對上圖進行dfs,則訪問順序為 a b d c e 使用偽 如下 vector g maxn int v...
演算法基礎 DFS(深度優先遍歷)
brycezou 163.com dfs的基本思想 從圖的某個頂點開始,一路向前,當沒有 新的 未被訪問的 頂點可訪問時逐層回退,繼續去發現新的頂點 直到源點可達的所有頂點都被訪問為止。這一過程類似於樹的前序遍歷。本文基於圖的鄰接表形式,分別給出了遞迴版本和非遞迴版本的dfs演算法 本 旨在清晰地展...