蠻力法解決0 1揹包問題

2021-08-17 14:04:35 字數 1408 閱讀 2479

使用蠻力法解決0/1揹包問題,就是將所有的物品裝入揹包的可能全部列舉出來。這個可以通過遞迴的方式實現。遞迴的過程可以看成是對一棵樹的深度優先遍歷:

例如上圖,假設從揹包中的1號物品開始列舉所有的可能。如果每一層僅僅簡單的在迴圈中使用遞迴,則該程式就不會結束。需要使用乙個一維向量用於標記當前哪些編號已經裝入了。

例如,當前1號物品已經裝入揹包,首先標記1號物品已經裝入。之後,在迴圈中首先選擇2號物品,如果沒有超出揹包的最大承重的話,標記2號物品已經裝入。當前還有3、4號物品沒有裝入,所以繼續遞迴嘗試裝入3、4號物品。在裝入2號物品之後的所有可能的遞迴全部完成後,修改當前標記,並將2號物品從揹包中拿出,之後就可以遞迴遍歷放入3號物品之後的可能的情況了。

**如下:

#include #include #define pac_max_vol	10	//揹包最大承重10

using namespace std;

void dfs(const vectorweights, const vectorvals, bool visit, int currweight, vectorseq);

void outputresult(vectorweights, vectorvals, bool visit, int currweight, vectorseq);

/*** 使用遞迴的方式遍歷所有的可能

*/void dfs(const vectorweights, const vectorvals, bool visit, int currweight, vectorseq)

} outputresult(weights, vals, visit, currweight, seq);

return;

}/**

* 輸出當前結果

*/void outputresult(vectorweights, vectorvals, bool visit, int currweight,vectorseq)

cout << "\n-----------------------------" << endl;

}int main()

; //各個物品的重量

const vectorvals = ; //各個物品的價值

vectorseq;

bool visit[4] = ; //用於在遞迴中表示當前已有哪些物品放在揹包中了

dfs(weights, vals, visit, 0, seq);

return 0;

}

執行結果如下:

0 1揹包問題(蠻力法)

用蠻力法解決0 1揹包問題 例子輸入 4 6 5 43 4 2 31 1輸出 10 6 8 include include using namespace std intmain int w 5 v 5 int max 0 每輪最大價值 int max1 0 最終最大價值 int weight 0 ...

蠻力法求解0 1揹包問題C

先佔坑 include include 以下三個庫用於計算程式運算時間 include include include using namespace std define n 100 struct goods int n,bestvalue,cv,cw,c 物品數量,價值最大,當前價值,當前重量,...

演算法課 五種蠻力法解決01揹包問題

答案0 1揹包問題 演算法中非常經典的乙個例題,多種不同的演算法可以來實現 有n個重量分別是w1,w2 wn的物品 物品編號為1 n 它們的價值分別為v1,v2,vn 給定乙個容量為w的揹包。設計從這些物品中選取一部分放入該揹包的方案。每個物品要麼選中要麼不選中 每種物品是唯一的 要求選中的物品不僅...