class Solution {
public int findMaxForm(String[] strs, int m, int n) {
//两个背包,一个容量m只装0,一个容量n只装1,物品重量有0,1两个维度,每件物品价值为1
int[][] dp = new int[m+1][n+1];
//dp[j][k]:第一个背包能装j个0,第二个背包能装k个1,dp[j][k]就是在使用这两个背包的情况下能装的最大价值
for(int i=0;i<strs.length;i++){//一轮循环处理一件物品
int zeroCount = 0;//该字符串0的个数
int oneCount = 0;//该字符串1的个数
for(int j=0;j<strs[i].length();j++){//分别统计这个字符串0和1的个数
if(strs[i].charAt(j) == '0')
zeroCount++;
else{
oneCount++;
}
}
for(int j=zeroCount;j<=m;j++){//填表,为什么从后面开始?正序会出现前面的物品被多拿的情况
for(int k=oneCount;k<=n;k++){
dp[j][k] = Math.max(dp[j][k],dp[j-zeroCount][k-oneCount]+1);//拿或不拿,不拿就是dp[j][k],拿就是后者
}
}
}
return dp[m][n];
}
}
力扣474. 一和零
最新推荐文章于 2024-07-25 17:54:26 发布