問題描述:
現有n種物品,對1<=i<=n,已知第i種物品的重量為正整數wi,價值為正整數vi,揹包能承受的最大載重量為正整數w,現要求找出這n種物品的乙個子集,使得子集中物品的總重量不超過w且總價值盡量大。(注意:這裡對每種物品或者全取或者一點都不取,不允許只取一部分)。
演算法分析:
1..實現的目標:使得子集中物品的總重量不超過w且總價值盡量大。
2.限制的條件:包最大載重量是一定的,物品的個數是一定的。
3.實現的過程:對每種物品進行捨取。
4.實現的方法:遞迴。
對於第n個物品來說,我們對它有兩種處理方式。
1. 放到揹包中,我們用x[n]=1表示。
2. 由於條件限制,不能放到揹包中,用x[n]=0表示。
重新審視一下,我們會發現,對這個物品處理完後,我們會發現我們遇到了相似的問題
1. 若物品放到了揹包中,我們的任務變為:現在變成了有n-1種物品,揹包能承受的最大載重量為正整數w-wi,找到最優解。
2. 若物品沒有放到揹包中,我們的任務變為:現在變成了有n-1種物品,揹包能承受的最大載重量為正整數w,找到最優解。
證明結論:
設函式knapsack(n,m)來表示從n個物品中,揹包的最大承重是m的條件限制下的最好方案的值根據上述的兩種情況我們可以列出下列等式:
遞迴呼叫的終結條件是揹包的容量為0或物品的數量為0
下面我們來看看限制條件:
為什麼我們會不選那個物品呢?因為選了它就不會得到最大值。就是說,
knapsack(n,m)>knapsack(n-1,m-wn)+vn;
程式實現:
intmake(int i, int j)
if(j >= weight[i]) //揹包剩餘空間可以放下物品 i
return r;
}
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...
揹包問題 01揹包
有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...
揹包問題(01揹包)
1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...