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 的揹包可以獲得的最大價...