模版题-动态规划-一和零( 01背包 多维 )

管理员
**01背包问题中,背包可以是多维的。** 416. 分割等和子集 :给定背包容量,能不能装满这个背包。 1049. 最后一块石头的重量II :给定背包容量,尽可能装,最多能装多少 494. 目标和 :给定背包容量,装满背包有多少种方法。 474. 一和零 :给定背包容量,装满背包最多有多少个物品。 ```python class Solution: # 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 # 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 # 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 # 1 <= strs.length <= 600 # 1 <= strs[i].length <= 100 # strs[i] 仅由 '0' 和 '1' 组成 # 1 <= m, n <= 100 def findMaxForm(self, strs: List[str], m: int, n: int) -> int: # 用 strs 装入 ( m,n )背包 # m个0 和 n个1 可以视作是二维的背包 # dp的含义: dp[ i ][ j ]表示容积为i个0和j个1的背包内包含的最大物品数 dp = [ [ 0 for _ in range( n + 1 ) ] for _ in range( m + 1 ) ] for s in strs: count_0 = 0 count_1 = 0 for v in s: if v == '0': count_0 += 1 if v == '1': count_1 += 1 for i in range( m, count_0 - 1, -1 ): for j in range( n, count_1 - 1, -1 ): dp[ i ][ j ] = max( dp[ i ][ j ], dp[ i - count_0 ][ j - count_1 ] + 1 ) return dp[ m ][ n ] ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧