You are given an array of binary strings strs and two integers m and n.
Return the size of the largest subset of strs such that there are at mostm0's and n1's in the subset.
A set x is a subset of a set y if all elements of x are also elements of y.
Example 1:
Input: strs = ["10","0001","111001","1","0"], m = 5, n = 3
Output: 4
Explanation: The largest subset with at most 5 0's and 3 1's is {"10", "0001", "1", "0"}, so the answer is 4.
Other valid but smaller subsets include {"0001", "1"} and {"10", "1", "0"}.
{"111001"} is an invalid subset because it contains 4 1's, greater than the maximum of 3.
Example 2:
Input: strs = ["10","0","1"], m = 1, n = 1
Output: 2
Explanation: The largest subset is {"0", "1"}, so the answer is 2.
Constraints:
1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] consists only of digits '0' and '1'.
1 <= m, n <= 100
Solutions
Solution 1: Dynamic Programming
Thinking
Selecting the most strings under budgets of zeros and ones is \(0\)-\(1\) knapsack with two weights. Subset search is too large.
\(f[i][j][k]\) is the best count using the first \(i\) strings, at most \(j\) zeros and \(k\) ones. Skip copies the previous row; take adds \(1\) when the budgets allow.
Count \(0/1\) in the current string before filling the row so the transition uses that item's cost.
We define \(f[i][j][k]\) as the maximum number of strings that can be obtained from the first \(i\) strings using \(j\) zeros and \(k\) ones. Initially, \(f[i][j][k]=0\), and the answer is \(f[sz][m][n]\), where \(sz\) is the length of the array \(strs\).
For \(f[i][j][k]\), we have two choices:
Do not select the \(i\)-th string, in which case \(f[i][j][k]=f[i-1][j][k]\);
Select the \(i\)-th string, in which case \(f[i][j][k]=f[i-1][j-a][k-b]+1\), where \(a\) and \(b\) are the number of zeros and ones in the \(i\)-th string, respectively.
We take the maximum of these two choices to obtain the value of \(f[i][j][k]\).
The final answer is \(f[sz][m][n]\).
The time complexity is \(O(sz \times m \times n)\), and the space complexity is \(O(sz \times m \times n)\), where \(sz\) is the length of the array \(strs\), and \(m\) and \(n\) are the upper limits on the number of zeros and ones, respectively.
Row \(i\) depends only on row \(i-1\). Update \(j\) and \(k\) downward and drop the first dimension. Space becomes \(O(mn)\), and a string cannot be taken twice.
We notice that the calculation of \(f[i][j][k]\) only depends on \(f[i-1][j][k]\) and \(f[i-1][j-a][k-b]\). Therefore, we can eliminate the first dimension and optimize the space complexity to \(O(m \times n)\).