class Solution {
public int findMaxForm(String[] strs, int m, int n) {
if (strs.length == 0) return 0;
int[][] dp =new int[m+1][n+1];//strs 数组里的元素就是物品,m和n是背包,二维的背包
// 遍历物品,字符串中有各个字符
for(String s :strs) {
int zero = 0,one = 0;//统计字符串中各个字符的01数量。
for(char c:s.toCharArray()) {
if (c == '0') ++zero;
else ++one;
}
// 两个都是>=,因为这两个都是遍历背包容量
for (int i = m; i >=zero; i--) {
for (int j = n; j >= one; j--) {
dp[i][j] = Math.max(dp[i][j], 1+dp[i-zero][j-one]);
}
}
}
return dp[m][n];
}
}
474.一和零。01背包。详细注释版0ms
最新推荐文章于 2025-12-04 22:00:44 发布
该博客讨论了一种使用动态规划求解01背包问题的算法。通过创建一个二维数组dp来存储子问题的解,遍历所有物品并更新背包容量为m和n时的最大价值。算法以字符串表示物品,统计每个字符串中'0'和'1'的数量,并在dp数组中进行更新。最终返回dp[m][n]作为最大价值。
7550

被折叠的 条评论
为什么被折叠?



