本题抽象为0-1背包问题,关键在于抽象后的背包是一个二维背包,此时 dp[i][j] 中 i 不再表示物品的种类,而是物品重量的一个维度。
- dp[i][j] 表示 存在 i 个0, j 个 1 的最大集合数
- 递推公式 dp[i][j] = dp[i - zeroNums][j - oneNums],这是一个二维的背包
- 0 1背包问题,初始化为0即可
- 遍历顺序,首先顺序遍历物品,即遍历字符串数组的每个元素,然后统计这个元素 0 1的数量,然后从后往前遍历背包容量
- 本题的dp[i][j] 同样是一个滚动数组
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for(string str : strs){
int zeroNum = 0;
int oneNum = 0;
for(char c : str){
if(c == '0'){
zeroNum++;
}else{
oneNum++;
}
}
for(int i = m; i >= zeroNum; i--){
for(int j = n; j >= oneNum; j--){
dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
}
}
}
return dp[m][n];
}
};