DFS 剪枝解決0 1揹包

2021-08-18 18:29:36 字數 713 閱讀 1764

有num件物品,每件物品的重量為w[i],價值為v[i]。現在需要選出若干件物品放入乙個容量為capacity的揹包中,使得在選入揹包的物品重量和不超過容量capacity的前提下,讓揹包中的物品的價值之和最大,求最大價值(1 <= num <= 20)

分析:可用dfs搜尋所有情況,但缺點在於進行過多無用搜尋。可以用當前重量與最大重量的關係來限制,當條件滿足時再更新價值,進行下次搜尋。

**:

#include#define max 20

using namespace std;

int w[max] = , v[max] = ;

int capacity = 0;

int num = 0;

int ans = 0;

void dfs(int start, int weight, int value)

if(weight + w[start] <= capacity)

dfs(start + 1, weight + w[start], value + v[start]);

} dfs(start + 1, weight, value);

}int main()

for(int i = 0; i < num; i++)

dfs(0, 0, 0);

cout << ans << endl;

return 0;

}

DFS解決01揹包問題

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

揹包問題(dfs剪枝優化)

時間複雜度指數級 剪枝操作確實可以減去數倍的計算時間 clock t start1,finish1,start2,finish2 double duration1,duration2 const int maxn 40 int n,v,maxvalue 0 物品件數,揹包容量,最大價值 int w ...

回溯法加剪枝解決01揹包問題 C

01 揹包問題 knapsack 是解決如何將乙個揹包的價值最大劃的問題 輸入 c 揹包最大容量,w 物品的重量 v 物品的價值 輸出 bestv 最大的可放置在揹包內的物品價值總和,bestx 對應bestp的物品取法,即最優值和最優解 例如 輸入 c 30,w v 則輸出 bestv 50,be...