2D 0/1 knapsack
Time O(len × m × n) Space O(m × n)Count each string's zeros and ones; for z from m down, o from n down: dp[z][o] = max(dp[z][o], dp[z − zeros][o − ones] + 1).
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
for (String s : strs) {
int zeros = 0, ones = 0;
for (char c : s.toCharArray()) { if (c == '0') zeros++; else ones++; }
for (int z = m; z >= zeros; z--)
for (int o = n; o >= ones; o--)
dp[z][o] = Math.max(dp[z][o], dp[z - zeros][o - ones] + 1);
}
return dp[m][n];
}
}Verdict: Same idea, one more dimension.