二維揹包問題

2021-10-03 06:08:38 字數 1121 閱讀 6272

步驟: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了。並且我...

二維費用揹包問題(揹包九講)

前言 對於一些揹包問題,重點還是在於如何找出 揹包容量 和 各種代價 以及價值,如此問題便迎刃而解了。下午 打籃球居然下冰雹了,悲催了。問題 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有 乙個可付出的最大值 揹包容量 問怎樣選擇物品可...