動態規劃第二講 完全揹包與多重揹包問題

2021-06-22 20:40:51 字數 1985 閱讀 3086

上一節,我們討論了01揹包問題,說明了*遞迴與分治法 與 動態規劃dp的區別和聯絡,介紹了快取的概念*。以下,我們用dc、dp、cache分別表示分治法、動態規劃和快取。本節,我們討論01揹包的另外兩種形似——完全揹包和多重揹包問題,分析dp問題的另外一些情況。

同樣有n種價值和重量分別為weight[i] and value[i], 揹包大小w。限制條件:每種物品數目是無限的。問:能挑選出來的總價值最大的物品組合總重量?

分析一:這裡,我們無視數量有限這個條件,可以得到下列遞迴式:

dp[i+1][j] = max

下面,來實現這個動態規劃(留給讀者)。很不幸,我們發現這次的時間複雜度變成了三重迴圈,o(nw^2). 因為,此時將子問題組成原問題,需要的組合數目是w個而不是常數項。

分析二:

對上述遞迴式進行變形,可以變成dp[i+1][j] = max;這樣就可以將時間複雜度從o(nw^2)轉化成o(nw).這個變形可以完全用數學化公式來實現,對應的物理意義:從前i+1號物品中選取j重的組合包含兩種:1)不包含i+1號物品dp[i][j] 2) 包含至少乙個i+1號物品dp[i+1][j-w[i]] + v[i].

優化2:dp陣列的重複利用

另外,我們注意到,在在遞推關係dp[i+1][j] = max中,dp[i+1][j]中,計算d[i+1][j]的時候僅僅用到了上一行左側的資料,所有我們可以對陣列進行重複利用,這樣能夠減少空間上的時間複雜度和程式執行時間(程式具有更好的區域性性):

dp[j] = max(dp[j], dp[j-w[i]] + v[i]);

和第一節中同樣的揹包問題,我們增加如下的限制條件:

1< n< 100

1< wi < 10^7

1< vi < 100

1< w < 10^9

此時,顯然o(nw)的演算法時間複雜度就不是能夠接受的了;此時我們需要對子問題的定義作出變形—— dp[i][j]原來表示前i號物品選取重量不超過j的組合能產生的最大值, 現在dp[i][j]:前i號物選取價值為j的組合占用的最小重量,最後取出dp[n][j]<=w 的最大的j即可。

此時:初始化dp[0][0]=0;dp[0][j]=inf

dp[i+1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i]);

有n種大小不同的數字ai,每種mi個,是否可以從中選取組合,使得它們的和是k

限制條件:

n<100;ai, mi<10^5; k<10^5

分析一:套用完全揹包問題

dp[i][j]:前i號數字是否能組成和為j的組合;這樣得到遞推關係dp[i+1][j] ||= dp[i][j-k*a[i]];

時間複雜度o(nkk);這個時間複雜度並不好;一般來說dp的子問題不應該用來儲存bool的結果,這意味著我們損失了更多的資訊。

我們仔細來分析一下時間複雜度主要耗費在什麼地方,先看沒有優化之前的**

for (i = 0; i < n; ++i)}}

分析2:「 優化成最優子結構」

顯然,for k 部分的迴圈,直觀感覺是有冗餘。分類一下,如果能從前i中數字選擇出k和,a[i]可能被選取1次以上或者沒有被選取

如果a[i]沒有被選取,那麼意味著dp[i][j]=true;

如果a[i]被選取了1次以上,意味著dp[i+1][j-a[i]]=true;

也就是說,dp[i+1][j]本來是和dp[i][j-k*a[i]]這麼多子問題相關的;但是現在被轉化成兩個子問題dp[i][j] 和dp[i+1][j-a[i]],是不是很神奇?很顯然,在這裡,我們通過分治法對子問題進行了合併。

進一步,如果定義dp[i+1][j]:前i種數加和得到j的時候,a[i]剩餘的個數,則有

dp[i+1][j]=

總結:在計數原理中,這種 子問題分類合併的思想和方法非常常用!

動態規劃之01揹包,完全揹包,多重揹包

01揹包問題,是用來介紹動態規劃演算法最經典的例子。f i,j 表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。pi表示第i件物品的價值。決策 為了揹包中物品總價值最大化,第 i件物品應該放入揹包中嗎 0 1的選擇 題目描述 有編號分別為a,b,c,d,e的五件物品,它們的...

動態規劃 多重揹包

動態規劃 多重揹包 時間限制 1 sec 記憶體限制 64 mb 提交 5 解決 5 提交 狀態 討論版 張琪曼 魔法石礦裡每種魔法石的數量看起來是足夠多,但其實每種魔法石的數量是有限的。李旭琳 所以我們需要改變裝包策略啦。現有n n 10 種魔法石和乙個容量為v 0第一行為兩個數字,即v和n。以下...

動態規劃 多重揹包

概念 多重揹包 有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,並且價值總和最大。這類問題即為多重揹包問題。把多重揹包當成01揹包 我們樸素的想法就是,對於某一種物品,我們看取乙個的時候,跑一...