動態規劃系列 不再為 揹包 問題煩惱

2021-10-09 14:59:44 字數 2954 閱讀 9505

本篇文章將站在labuladong文章上對【揹包】系列問題進行總結。

通過本文,你可以解決一下leetcode問題。

動態規劃幫助我們有效率地遍歷問題的解,反覆強調的在做動態規劃時,需要注意的點有。

第一,明確【狀態】和【選擇】

第二,明確dp陣列的含義

第三,找出狀態轉移方程式

第四,確認好邊界(base line)情況

一般來說,對於我們比較困難在於第二和第三點,因為兩者有密切的練習,我們需要明確含義才能想明白狀態之間的改變。

labuladong給出的框架如下:

接下來我們將帶著這個框架去解決【揹包】系列問題。

我們都知道最經典的0-1揹包是這樣設定的:

給你乙個可裝載重量為w的揹包和n個物品,每個物品有重量和價值兩個屬性。其中第i個物品的重量為wt[i],價值為val[i],現在讓你用這個揹包裝物品,最多能裝的價值是多少?

n = 3, w = 4

wt = [2, 1, 3]

val = [4, 2, 3]

既然是0-1揹包,也就是說物品要麼裝,要麼不裝,不可以被分割。

接下來,我們套用標準模板來走一遍思路。

第一步,明確【狀態】和【選擇】。

【狀態】對於我們描述問題是關鍵,也就是通過狀態我們可以有效地表達出當前的問題情況。那麼在揹包問題中,【揹包的容量】和【可選擇的物品】就構成了我們的【揹包問題】。

對於乙個物品我們所擁有的【選擇】顯而易見,那就是**「放」**還不是「**不放」**這個物品。

第二步明確dp陣列的含義

在上一步中我們只是把關鍵的要素確定了出來,而在這一步中dp陣列起到的就是描述問題的紐帶。把我們在步驟一中提到的要素放在dp中,就可以有效地【描述問題】,所以是dp【】=。

第三步根據選擇明確狀態的轉移

對於選擇來講只有兩種,放還是不放。那麼我們還要對應寫出,當物品選擇「放」時的【狀態】,和不放的狀態。

相信大家已經都很熟悉了。

如果你沒有把這第i個物品裝入揹包,那麼很顯然,最大價值dp[i][w]應該等於dp[i-1][w]。你不裝嘛,那就繼承之前的結果。

如果你把這第i個物品裝入了揹包,那麼dp[i][w]應該等於dp[i-1][w-wt[i-1]] + val[i-1]。

第四步最後不要忘記確認base line。

針對問題,考慮周全它的基本情況。其實在這裡我們又可以加深一層體會,在搜尋問題所有解的時候。不管是回溯還是動態規劃,本質上也是要找到問題的【突破口】。對於回溯演算法,遍歷到深處回退,以及動態規劃從baseline上開始計算,都需要描述清楚。

附加步驟狀態壓縮

當問題的狀態比較多時,實際上動態規劃求解的過程只需要依靠【上乙個狀態】做出抉擇。基於此,我們常常可以把空間繼續壓縮,來優化演算法,儘管這樣會降低**的可讀性。

最後給出0-1揹包的**,懶得打了,來自labuladong,推廣好文。

int

knapsack

(int w,

int n, vector<

int>

& wt, vector<

int>

& val)

else}}

return dp[n]

[w];

}

實際上【揹包】問題和子集劃分的問題可以相互聯絡,我們來看例項。

乍一看可能還沒那麼快反應過來。實際上要求劃分的兩個子集元素和相等,假設該集合的所有元素和為sum,那麼我們就得在集合中找到合適的元素,使得他們的和為sum/2。問題用【揹包】語言翻譯一下也就是:

給乙個揹包容量為【sum/2】和【n】個物品(元素),每個物品重量為 nums[i], 是否存在一種裝法, 能將揹包裝滿。

根據之前提出的框架和結構,寫出**。

完全揹包的改變在於物品的使用是不限制的,因此狀態的總和來自於【選】與【不選】狀態的相加,即是上乙個物體不管【選】還是【沒選】都不會影響我當前的問題狀態,隱藏的含義就是物體的使用是不限制的。

根據框架和步驟,給出**。

class

solution

}return dp[coins.

size()

][amount];}

};

參考:

動態生成form表單,不再為表單煩惱

具有資料收集 校驗和提交功能的表單生成器,支援雙向資料繫結和事件擴充套件,元件包含有核取方塊 單選框 輸入框 下拉選擇框等表單元素以及省市區 聯動,時間選擇,日期選擇,顏色選擇,滑塊,評分,框架,樹型,檔案 上傳等功能元件。github gitee 圖例 demo npm install form ...

動態規劃 揹包問題(DP系列)

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...

動態規劃系列之揹包問題

揹包問題是一類經典問題,經典的揹包九講 推薦部落格。主要有0 1揹包 完全揹包 分組揹包 多重揹包。0 1揹包問題主要場景如下 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i,價值是w i。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。276.柵欄塗色leet...