0 1揹包問題(DP)

2022-06-16 06:24:11 字數 1523 閱讀 6828

揹包問題具體例子:假設現有容量10kg的揹包,另外有3個物品,分別為a1,a2,a3。物品a1重量為3kg,價值為4;物品a2重量為4kg,價值為5;物品a3重量為5kg,價值為6。將哪些物品放入揹包可使得揹包中的總價值最大?

首先想到的,一般是窮舉法,乙個乙個地試,對於數目小的例子適用,如果容量增大,物品增多,這種方法就無用武之地了。

其次,可以先把價值最大的物體放入,這已經是貪婪演算法的雛形了。如果不新增某些特定條件,結果未必可行。

最後,就是動態規劃的思路了。先將原始問題一般化,欲求揹包能夠獲得的總價值,即欲求前i個物體放入容量為m(kg)揹包的最大價值c[i][m]——使用乙個陣列來儲存最大價值,當m取10,i取3時,即原始問題了。而前i個物體放入容量為m(kg)的揹包,又可以轉化成前(i-1)個物體放入揹包的問題。下面使用數學表示式描述它們兩者之間的具體關係。

表示式中各個符號的具體含義。

w[i] :  第i個物體的重量;

p[i] : 第i個物體的價值;

c[i][m] : 前i個物體放入容量為m的揹包的最大價值;

c[i-1][m] : 前i-1個物體放入容量為m的揹包的最大價值;

c[i-1][m-w[i]] : 前i-1個物體放入容量為m-w[i]的揹包的最大價值;

由此可得:

c[i][m]=max(下圖將給出更具體的解釋)

根據上式,對物體個數及揹包重量進行遞推,列出乙個**(見下表),**來自( ,當逐步推出表中每個值的大小,那個最大價值就求出來了。推導過程中,注意一點,最好逐行而非逐列開始推導,先從編號為1的那一行,推出所有c[1][m]的值,再推編號為2的那行c[2][m]的大小。這樣便於理解。

m 表示揹包的最大容量

* @param

n 表示商品個數

* @param

w 表示商品重量陣列

* @param

p 表示商品價值陣列

*/public

static

int backpack_solution(int m, int n, int w, int

p)

else

c[i][j] = c[i - 1][j];}}

return

c; }

01揹包問題 dp

這道題需要從定義去理解 dp i 1 j 定義為 在前i個物品裡面選出來的總體積不大於j的最大的價值 所以這樣就可以知道了,dp i 1 j 就表示在前i個物體裡面選出來的不超過給定體積的最大價值了 所以清楚定義後就有 如果當前超過了當前體積了 那麼他肯定就是dp i 1 j dp i j 了 如果...

01揹包問題(dp)

思路 填表。以下有幾種情況 情況一 第j件放不進去 當前容量i小於第i件物品 這時所得價值為 dp i j dp i j 1 情況二 第j件不放進去 容量足夠 這時所得價值為 dp i j dp i j 1 情況三 第j件放進去 容量足夠 這時所得價值為 dp i weigh j j 1 value...

01揹包問題 DP

有 n件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 vi,wi,用...