二维背包问题
作者:互联网
本质: 状态转移方程,即下一时刻状态受上一时刻状态的影响
步骤:
1、建立目标域 (即,多个背包的可能性组合)
2、判断当前时刻的状态值
例题:
输入: Array = {"10", "0001", "111001", "1", "0"}, 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]
标签:背包,strs,问题,item,二维,count1,容纳,dp 来源: https://blog.csdn.net/weixin_38740463/article/details/104514368