深度優先搜尋(dfs)與揹包問題

2021-10-03 05:58:11 字數 1814 閱讀 7517

深度優先搜尋實質就是列舉,因此演算法的複雜度可能比較大。

揹包問題是經典的動態規劃問題,掌握遞推公式就可以快速求解,但在不知道遞推公式的情況下,使用深度優先搜尋也是一種可行的辦法。

本部落格不推薦使用深度優先搜尋去解決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 也就是去除沒有用...