当前位置:   article > 正文

二维背包问题_dp = [[0] * (m+1) for _ in range(n+1)]

dp = [[0] * (m+1) for _ in range(n+1)]

本质: 状态转移方程,即下一时刻状态受上一时刻状态的影响

步骤:

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 ])

当前时刻背包容纳数量  =  (  未变化前背包容纳数量  , 变化后的背包容纳数量 )中的最大值

 

  1. class Solution:
  2.     def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
  3.         if len(strs) == 0:
  4.             return 0
  5.         
  6.         dp = [[0]*(n+1) for _ in range(m+1)]   #建立 坐标域
  7.         
  8.         for strs_item in strs:
  9.             item_count0 = strs_item.count('0')                #统计列表中个元素的‘0’‘1’数量
  10.             item_count1 = strs_item.count('1')
  11.             
  12.             #遍历可容纳的背包 
  13.             for i in range(m, item_count0 - 1, -1):  #采取倒序,由于后一时刻受前一时刻的影响
  14.                 for j in range(n, item_count1 - 1, -1):
  15.                     dp[i][j] = max(dp[i][j], 1 + dp[i-item_count0][j-item_count1])
  16.                     
  17.         return dp[m][n] 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/466321
推荐阅读
相关标签
  

闽ICP备14008679号