DFS解決01揹包問題

2021-06-29 13:11:34 字數 781 閱讀 2558

本篇博文著重用dfs解決著名的揹包問題

01揹包問題要點在:選與不選。所以我們很容易聯想到dfs來解決這個問題!

下面我們來看看是如何實現的:

#includeusing namespace std;

const int n=30;

int w[n],value[n],n,maxvalue=0,v;

void dfs(int index,int sumw,int sumv)

return;

} dfs(index+1,sumw+w[index],sumv+value[index]);//選

dfs(index+1,sumw,sumv);//不選

}int main()

for(int i=1;i<=n;++i)

dfs(1,0,0);

cout<

但是注意到乙個問題沒有?總是把n件物品選完後才去更新最大值,忽視了總重不超過v的條件,所以,我們可以來優化一下。

void dfs(int index,int sumw,int sumv)

dfs(index+1,sumw+w[index],sumv+value[index]);//選

} }

這樣,演算法時間複雜度在一定程度上減輕了很多,這種根據題目條件來修改遞迴邊界的方法叫做剪枝。

DFS 剪枝解決0 1揹包

有num件物品,每件物品的重量為w i 價值為v i 現在需要選出若干件物品放入乙個容量為capacity的揹包中,使得在選入揹包的物品重量和不超過容量capacity的前提下,讓揹包中的物品的價值之和最大,求最大價值 1 num 20 分析 可用dfs搜尋所有情況,但缺點在於進行過多無用搜尋。可以...

DFS解01揹包問題

01揹包問題的dfs解法 直接dfs未剪枝 時間複雜度 o 2n nn 其原因是對任意的物品,都是選或者不選 兩次的情況 dfs三個形參 物品序號index,放進揹包的重量sumw,以及放進揹包的總價值sumc 主要搜尋路徑 序號為index的物品放入揹包時 序號為index的物品不放入揹包時 搜尋...

01揹包問題 DFS 動態規劃

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