status
date
slug
tags
category
type
password
icon
本文目錄

完全背包

經典原型

題目描述

種物品和容量為 的背包,每種物品可以無限次被重複挑選。 第 件物品的的體積是 , 價值是 求將哪些物品放入背包可使總體積不超過背包的容量,且價值總和最大。
 

解題思路

其實就是將 01 背包的問題延伸至重複挑選的情況下,因此狀態 定義也是同樣表示只考慮前 件物品時,放入容量為 的背包時可以獲得的最大價值。
轉移方程也是類似,這邊列出前幾個狀態的方程式:
  • 選擇 0 件物品
  • 選擇 1 件物品
  • 選擇 2 件物品
  • 選擇 件物品
 
因此,我們可以得到轉移式為:
 
寫成程式碼如下:
 

空間優化 1

 
前面已經介紹過兩種優化至 的方式,這邊就不再贅述直接實作:
 

空間優化 2

當然這邊也是能夠以 空間複雜度實作,不過這邊優化的方式就跟 01 背包不太一樣了。
因為本人能力有限,因此這邊引用宮水三葉大神的證明QQ
notion image
 
畫成圖大概會長這個樣子:
notion image
 
在上圖的證明中,我們可以看到簡化轉移方程式之後,除了將空間複雜度從 壓縮成 以外,也成功地將時間複雜度從 優化成了
 

小結

 
01 背包的轉換方程式:
因為計算 時,狀態取決於
因此要確保先更新狀態 才能更新
也就是由大到小進行 Iterate
 
完全背包的轉移方程式:
因為計算 時,狀態取決於
因此要確保先更新狀態 才能更新
也就是由小到大進行 Iterate
 
程式碼如下:
 

練習

LeetCode 279

 

LeetCode 322

 

LeetCode 518

 
01背包 學習筆記多重背包 學習筆記
Loading...
Zixu
Zixu
Welcome to my webstie.
Analytics
Post Count:
224
Latest posts
還好我退了 部隊篇
2025/08/08
泡泡
2025/08/05
還好我退了 新訓篇
2025/08/02
大學畢業心得
2025/07/12
AP325 隨筆
2025/06/07
Lycoris Recoil 莉可麗絲
2025/05/04