[力扣题解] 474. 一和零
题目:474. 一和零
思路
01背包
一维数组形式,只不过重量有2个维度;
f[i][j]
:满足条件“不超过i
个0,j
个1”的最大子集长度;f[i][j] = max(f[i][j], f[i-zero_num][j-one_num])
,其中zero_num
,one_num
分别是遍历物品(strs中每个字符串)时统计的0
的个数,1
的个数;
代码
// 01背包问题
// 一维数组,重量有2个维度
// f[i][j] : 最大有i个0, j个1的最大子集个数
// f[i][j] = f[i-zero_num[i]][j - one_num[i]] + 1;class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {int i, j;int zero_num = 0, one_num = 0;vector<vector<int>> f(m+1, vector<int>(n+1, 0));// 遍历物品for(string s:strs){zero_num = count(s.begin(), s.end(), '0');one_num = count(s.begin(), s.end(), '1');// 遍历重量for(i = m; i >= zero_num; i--){for(j = n; j >= one_num; j--){f[i][j] = max(f[i][j], f[i-zero_num][j-one_num] + 1);}}}for(i = 0; i <= m; i++){for(j = 0; j <= n; j++){cout << f[i][j] << ", ";}cout << endl;}return f[m][n];}
};