使用蠻力法解決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的揹包。設計從這些物品中選取一部分放入該揹包的方案。每個物品要麼選中要麼不選中 每種物品是唯一的 要求選中的物品不僅...