DFS解01揹包問題

2021-10-05 07:37:33 字數 1294 閱讀 1763

01揹包問題的dfs解法

直接dfs未剪枝**

時間複雜度 o(2n

^nn),其原因是對任意的物品,都是選或者不選(兩次的情況)

dfs三個形參

物品序號index,放進揹包的重量sumw,以及放進揹包的總價值sumc

主要搜尋路徑

序號為index的物品放入揹包時

序號為index的物品不放入揹包時

//搜尋路徑

dfs(index+

1,sumw+w[index]

,sumc+c[index]);

//選第index件放入揹包

dfs(index+

1,sumw,sumc)

;//不選第index件放入揹包

**

#include

using

namespace std;

const

int maxn=

100;

int n,maxc=

0,v,w[

200]

,c[200];

void

dfs(

int index,

int sumw,

int sumc )

//搜尋路徑

dfs(index+

1,sumw+w[index]

,sumc+c[index]);

//選第index件放入揹包

dfs(index+

1,sumw,sumc)

;//不選第index件放入揹包

}int

main()

剪枝

選擇第index件物品放入揹包之前,先檢查重量是否超過揹包容量v,如果超過,便不進入dfs遞迴分支。

而且更新最大價值maxc也不需要無時無刻更新,只需要在當第index件物品放入揹包後的價值超過放進揹包之前的價值時更新。

#include

using

namespace std;

const

int maxn=

100;

int n,maxc=

0,v,w[

200]

,c[200];

void

dfs(

int index,

int sumw,

int sumc )

}int

main()

對比剪枝前和剪枝後的**,程式得以優化。

DFS解決01揹包問題

本篇博文著重用dfs解決著名的揹包問題 01揹包問題要點在 選與不選。所以我們很容易聯想到dfs來解決這個問題!下面我們來看看是如何實現的 includeusing namespace std const int n 30 int w n value n n,maxvalue 0,v void df...

01揹包問題 DFS 動態規劃

有n件物品和乙個容量為v的揹包。第 i 件物品的 即體積,下同 是w i 價值是c i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大,求最大價值。1 n 20 dfs 遞迴遍歷,每種物品選和不選的兩種結果,所有情況都遍歷 includeusing namespace s...

0 1揹包問題(動態規劃解)

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。該問題的特點是每種物品僅有一件,可以選擇放或不放。用f i v 乙個二維陣列 表示前i件物品恰放入乙個容量為v 這裡不是總容量v 的揹包可以獲得的最大價...