给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

核心思想:本质上一个是一个背包问题,我们可以选择的最大的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]