什麼是揹包問題?
比如有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?(0/1揹包問題就是這n個物品中某乙個物品選還是不選,分別表示1和0)
題目描述:
比如有n個物品,它們有各自的體積w和價值v,現有給定容量的揹包ba**,如何讓揹包裡裝入的物品具有最大的價值總和?
解題步驟:
在解決問題之前,為描述方便,首先定義一些變數:vi表示第 i 個物品的價值,wi表示第 i 個物品的體積,定義v(i,j):當前揹包容量 j,前 i 個物品最佳組合對應的價值,同時揹包問題抽象化(x1,x2,…,xn,其中 xi 取0或1,表示第 i 個物品選或不選)。
1、建立模型,即求max(v1x1+v2x2+…+vnxn);
2、尋找約束條件,w1x1+w2x2+…+wnxn3、尋找遞推關係式,面對當前商品有兩種可能性:
4、填表,首先初始化邊界條件,v(0,j)=v(i,0)=0;v[i,v]是說從前i個物品中挑出物品,將他們放入體積為v的揹包可以獲得的最大價值。v[0,1…n]. 可以看做是從前0個物品中挑選,放入體積分別為0,1,…,n的揹包。f[0,1…n]可以看做是最簡化的01揹包問題了。
然後一行一行的填表:
5、輸出,**填完,最優解即v(number,capacity)=v(4,8)=10。
**:
public
class
test1
;//商品的體積2、3、4、5
int[
] v =
;//商品的價值3、4、5、6
int ba** =8;
//揹包大小
system.out.
println
(t1.
knapsack
(w, v, ba**));
}public
intknapsack
(int
w,int[
] v,
int ba**)
//如果不大於剩餘體積,則取待新增物品 加入或不加入揹包後的最大值
else}}
return dp[w.length-1]
[ba**];}
}
揹包問題 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...