步驟:1、建立目標域 (即,多個揹包的可能性組合)
2、判斷當前時刻的狀態值
例題:輸入: array = , m = 5, n = 3
輸出: 4
解釋: 總共 4 個字串可以通過 5 個 0 和 3 個 1 拼出,即 "10","0001","1","0" 。
解題思路:
1. 可用0和1的個數可以看成不同容量的揹包(二維)
dp[i][j] i 表示可用0的個數, j 表示可用的1的個數
2. 對應每乙個01串, 做的事情:
對於可以放得下的揹包 ①不放,則檢視當前揹包容納物品的數量 ②放,則 1(數量+1) + 剩餘揹包空間的能容納物品的數量(該值受上一時刻的影響)
3. 狀態轉移方程:
dp[i][j] = max(dp[i][j], 1 + dp[ i-item_count0 ][ j-item_count1 ])
當前時刻揹包容納數量 = ( 未變化前揹包容納數量 , 變化後的揹包容納數量 )中的最大值
class solution:
def findmaxform(self, strs: list[str], m: int, n: int) -> int:
if len(strs) == 0:
return 0
dp = [[0]*(n+1) for _ in range(m+1)] #建立 座標域
for strs_item in strs:
item_count0 = strs_item.count('0') #統計列表中個元素的『0』『1』數量
item_count1 = strs_item.count('1')
#遍歷可容納的揹包
for i in range(m, item_count0 - 1, -1): #採取倒序,由於後一時刻受前一時刻的影響
for j in range(n, item_count1 - 1, -1):
dp[i][j] = max(dp[i][j], 1 + dp[i-item_count0][j-item_count1])
return dp[m][n]
二維揹包問題(五)
二維揹包問題 一 問題描述 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有乙個可付出的最大值 揹包容量 問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a i 和b i 兩種代價可付出的...
揹包問題3 二維揹包和分組揹包
有總體積為v,且最大只能放質量為m mm的揹包中,存在n個物品,體積為v iv i vi 價值為w iw i wi 質量為m im i mi 求怎麼放可以得到最大價值。總體來說就是在01揹包的基礎上為物品新增了乙個重量的屬性,還是比較簡單,可以在我們之前的01揹包的 基礎上加一層迴圈就ok了。並且我...
二維費用揹包問題(揹包九講)
前言 對於一些揹包問題,重點還是在於如何找出 揹包容量 和 各種代價 以及價值,如此問題便迎刃而解了。下午 打籃球居然下冰雹了,悲催了。問題 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有 乙個可付出的最大值 揹包容量 問怎樣選擇物品可...