黔西南布依族苗族自治州网站建设_网站建设公司_H5网站_seo优化
2025/12/23 17:47:16 网站建设 项目流程

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
image

核心思想:本质上一个是一个背包问题,我们可以选择的最大的0和1的个数分别是m和n。从strs中,选择最大的子集数。等价成,一个背包,里面有k个物品,每一个物品分别需要两种货币(0以及1对应两种货币)购买,最多购买多少个。两种货币的背包问题。

状态定义:f[k][i][j] 对于前k个物品,我们使用i个0货币以及j个1货币,可以购买的最多的物品的数量。

状态转移:f[k][i][j] = max(f[k - 1][i][j], f[k - 1][i - zeros][j - ones])

python代码: 优化成二维的形式,从后向前遍历

class Solution:def findMaxForm(self, strs: List[str], m: int, n: int) -> int:f = [[0] * (n + 1) for _ in range(m + 1)]for s in strs:ones = s.count('1')zeros = s.count('0')for i in range(m, zeros - 1, -1):for j in range(n, ones - 1, -1):f[i][j] = max(f[i - zeros][j - ones] + 1, f[i][j])return f[m][n]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询