每個物品我們都有兩種選擇,乙個是放入,乙個是不放入。假設f[i][c]表示第i次選擇後,容量的為c的揹包的價值。
那麼對於選擇第i個的物品後其價值的第公式是:
1、表示f[i-1][j]表示第i-1次選擇後,容量為j的包的價值。
f[i][j]=f[i-1][j]
2、表示第i-1次選擇後,容量為j-w[i]的價值,因為放入所以揹包容量減少了,價值增加了 。
f[i][j]=f[i-1][j-w[i]]+v[i]
#include using namespace std;
#define max 100
int max(int a,int b)
int main()
; //f[i][c]第i次選擇後,所選物品放入乙個容量為c的揹包獲得的最大價值
int w[max], v[max]; //重量價值
cout>c;
cout>v[i];
//我們有兩個選擇,乙個是放入,乙個是不放入選其中最大值
for(int i = 1; i <= n; ++i)
//f[i-1][j-w[i]]+v[i]表示第i-1次選擇後,容量為j-w[i]的價值,因為放入所以揹包容量減少了,價值增加了
} cout<
演算法 回溯法 0 1揹包問題
fishing pan 回溯法是一種非常有效的方法,有 通用的解題法 之稱。它有點像窮舉法,但是更帶有跳躍性和系統性,他可以系統性的搜尋乙個問題的所有的解和任一解。回溯法採用的是深度優先策略。回溯法解決問題一般分為三個步驟 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度...
分支限界法01揹包問題 01揹包問題
1.01揹包問題的描述 有n個不可分割的物品,它們有各自的重量和價值,現有固定容量的揹包,選擇把哪些物品放入揹包可以讓揹包中物品的價值最大。2.錯覺 按照價值和重量的比值 價效比 進行排序,依次嘗試放入直到放不進揹包為止。但是細想思考一下就能發現,這個貪心演算法是有問題的,看下面乙個例子。揹包容量1...
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...