/**
* @param {string[]} strs
* @param {number} m
* @param {number} n
* @return {number}
*/
// 一样是可以转化为01背包问题, 物品的大小就是str中0 1的数量, 所以背包有两个维度
// 物品的价值就是子集数量的多少
var findMaxForm = function(strs, m, n) {
const dp = Array.from(Array(m+1), () => Array(n+1).fill(0));
// 先遍历物品 也就是数组元素 算出一个元素里有几个0 几个1
for(let i = 0;i<strs.length;i++){
var oneNum = 0, zeroNum = 0;
zeroNum += strs[i].split('0').length - 1;
oneNum += strs[i].split('1').length - 1;
// 再遍历背包容量 两个背包容量遍历顺序随意 倒序遍历即可
for(let i = m;i>= zeroNum;i--){
for(let j = n;j>=oneNum;j--){
dp[i][j] = Math.max(dp[i][j],dp[i-zeroNum][j-oneNum] + 1);
}
}
}
return dp[m][n];
};
leetcode474-一和零
最新推荐文章于 2024-10-01 18:52:56 发布