动态规划的思路:
1.把int【】【】【】数组压缩成int【】【】的滚动数组来进行解题,int【】【】代表的是在i个0和j个1中的最大子集的长度为多少,其中i和j表示的是背包的容量
2.同时计数出数组中的全部的0和1的个数。
3.倒序遍历dp数组,使每一个物品只能使用一次,递推公式为:在使用物品i和不使用物品i中选择最大的值。
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
//定义一个二维数组表示i个0和j个1时的最大子集的长度
int[][] dp = new int[m + 1][n + 1];
//计数元素中0和1的个数
int oneNum, zeroNum;
for (String str : strs) {
oneNum = 0;
zeroNum = 0;
for (char ch : str.toCharArray()) {
if (ch == '0') {
zeroNum++;
} else {
oneNum++;
}
}
//倒序遍历,使各个物品只能用一次
for (int i = m; i >= zeroNum; i--) {
for (int j = n; j >= oneNum; j--) {
dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
}
}
}
return dp[m][n];
}
}