深度優先搜尋實質就是列舉,因此演算法的複雜度可能比較大。
揹包問題是經典的動態規劃問題,掌握遞推公式就可以快速求解,但在不知道遞推公式的情況下,使用深度優先搜尋也是一種可行的辦法。
本部落格不推薦使用深度優先搜尋去解決01揹包問題,但有助於讀者進一步理解dfs。
使用深度優先搜尋解決01揹包問題
#include
#include
#include
#include
using
namespace std;
const
int maxn =30;
int n, v, maxvalue =0;
//物品的件數,揹包容量v,最大價值maxvalue
int w[maxn]
, c[maxn]
;//w[i]為每件物品的重量,c[i]為每件物品的價值
int vis[maxn]
;//標記矩陣
vector<
int>v;
//儲存選中物品的棧
//index為當前處理的物品編號
//sumw為當前的總重量
void
dfs(
int index,
int sumw)
maxvalue =
max(maxvalue,sum)
;//不超過揹包容量時更新最大價值maxvalue
return
;//一定別忘了return!
}//岔路口
dfs(index +
1, sumw)
;//不選第index件物品
if(vis[index]==1
)}intmain()
for(
int i =
0; i < n; i++
)dfs(0
,0);
cout << maxvalue;
return0;
}
有依賴的揹包問題
這是一道經典的有依賴的揹包問題:王強的購物單。
#include
#include
#include
using
namespace std;
const
int max =
1000
;int v[max]
, p[max]
, q[max]
, vis[max]
;int n, m, ans;
vector<
int>stack;
//記錄選中物品的棧
void
dfs(
int index,
int consume)
return;}
if(q[index]==0
)dfs
(index +
1, consume)
;//不選這個主件
}else
dfs(index +
1, consume)
;//不選這個附件}}
intmain()
dfs(1,
0); cout << ans << endl;
}}
最後:
當不知道動態規劃的遞推公式時,使用深度優先搜尋(實質就是列舉)可能是唯一的辦法,
當然複雜度是很大的,要盡可能的剪枝,剪枝就是藝術。
上面**執行超時,ac了70%,但也是不知道dp遞推公式時,可以參考的一種方法了。
深度優先搜尋可以在不住到規律的情況下,暴力解決很多問題。
深度優先搜尋DFS(迷宮問題)
問題及 給出迷宮的圖紙和初始終點位置,用dfs求最小步數。include using namespace std int n,m,p,q,min 99999999 int a 51 51 book 51 51 void dfs int x,int y,int step 順時針 右下左上 int tx...
DFS深度優先搜尋 迷宮問題
首先我們用乙個陣列來儲存這個迷宮,用 1 代表障礙物,用 0 代表可通行的路 define n 22 int maze n n 假設我們現在處於 x,y 點 x y 指 maze 陣列的行 列 對於接下來的每一條路徑,我們只能乙個乙個地去嘗試 我們可以先往右走,直到走不通的時候再退回來,然後再去嘗試...
深度優先搜尋DFS
作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...