01揹包問題
n 件物品和乙個容量為v的揹包,每件物品只能放一次。第i 件物品的費用是w[i] ,價值是v[i],求將哪些物品裝入揹包可使價值總和最大。
用子問題定義狀態:即f[i][j]表示前i件物品恰放入乙個容量為j的揹包可以獲得的最大價值。考慮第i個物品加入揹包或者不加入揹包,則其狀態轉移方程便是:
f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i])
依據這個思路,得到動態規劃的**如下:
public
intcountmaxvalue
(int
w,int[
] v,
int n,
int maxweight)
else}}
return f[n]
[maxweight]
;}
完全揹包問題public
intcountmaxvalue
(int n,
int m,
int[
] w,
int[
] v)}}
return f[n]
[m];
}
多重揹包問題
有n種物品和乙個容量為v的揹包。第i 種物品最多有p[i] 件可用,每件費用是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
這題目和完全揹包問題很類似。基本的方程只需將完全揹包問題的方程略微一改即可,因為對於第i 種物品有p[i]+1種策略:取0件,取1件……取p[i]件。令f[i][j] 表示前i種物品恰放入乙個容量為j的揹包的最大權值,則有狀態轉移方程:
f[i][j]=max(f[i−1][j−k∗w[i]]+k∗v[i])∣0<=k<=p[i]
演算法實現:
private
static
intcountmaxvalue
(int
w,int[
] v,
int[
] p,
int v)}}
return f[w.length]
[v];
}
混合揹包問題
如果將前面三個揹包混合起來,也就是說,有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。
有n種物品和乙個容量為v的揹包。第i 種物品最多有p[i] 件可用,每件費用是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。其中p[i] =integer.maxv表示有無窮件可用。
可以等同於多重揹包問題。
0 1揹包問題全解析
0 1揹包問題 給定n個重量為w1 w2 w3.wn,價值為v1 v2 v3.vn的物品,容量為c的揹包,求這個揹包可以裝下的價值最高的子集,每個物品只能使用一次 w 重量v 價值 c 5 容量 最佳子集為 2,1,2 12 10 15 37 對每個物品,都有選擇 不選兩個狀態,這樣解空間就可以描述...
三類博弈問題
有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個人輪流從堆中取物體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲,別看這遊戲極其簡單,卻蘊含著深刻的數學原理。下面我們來分析一下要如何才能夠取勝。一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流從這...
揹包問題全解
型別一 可分割性的物品 此型別為貪心問題 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在有很多物品 它們是可以分割的 我們知道它們每個物品的單位重量的價值v和重量w 1 v,w 10 如果給你乙個揹包它能容納的重量為m 10 m 20 你所要做的就是把物品裝到揹包裡,使...