三類揹包問題全解析

2021-09-28 00:08:03 字數 1417 閱讀 9812

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 你所要做的就是把物品裝到揹包裡,使...