本篇文章將站在labuladong文章上對【揹包】系列問題進行總結。
通過本文,你可以解決一下leetcode問題。
動態規劃幫助我們有效率地遍歷問題的解,反覆強調的在做動態規劃時,需要注意的點有。
第一,明確【狀態】和【選擇】
第二,明確dp陣列的含義
第三,找出狀態轉移方程式
第四,確認好邊界(base line)情況
一般來說,對於我們比較困難在於第二和第三點,因為兩者有密切的練習,我們需要明確含義才能想明白狀態之間的改變。
labuladong給出的框架如下:
接下來我們將帶著這個框架去解決【揹包】系列問題。
我們都知道最經典的0-1揹包是這樣設定的:
給你乙個可裝載重量為w的揹包和n個物品,每個物品有重量和價值兩個屬性。其中第i個物品的重量為wt[i],價值為val[i],現在讓你用這個揹包裝物品,最多能裝的價值是多少?既然是0-1揹包,也就是說物品要麼裝,要麼不裝,不可以被分割。n = 3, w = 4
wt = [2, 1, 3]
val = [4, 2, 3]
接下來,我們套用標準模板來走一遍思路。
第一步,明確【狀態】和【選擇】。
【狀態】對於我們描述問題是關鍵,也就是通過狀態我們可以有效地表達出當前的問題情況。那麼在揹包問題中,【揹包的容量】和【可選擇的物品】就構成了我們的【揹包問題】。
對於乙個物品我們所擁有的【選擇】顯而易見,那就是**「放」**還不是「**不放」**這個物品。
第二步明確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...