0、题目
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
链接:一和零
1、题目解析
先确定是什么背包!此处是0-1背包,不要想成多重背包了。
物品是什么?在这个问题中就是strs。
物品的价值是多少?每一个str的价值就是1。
背包是什么?背包在这个问题中是一个二维的数组,分别用m和n表示。
递归五部曲解答这一题:
public class FindMaxForm {
public int findMaxForm(String[] strs, int m, int n) {
// step1:定义dp数组并确定下标含义
int[][] dp = new int[m+1][n+1]; // dp数组:最多有i个0和j个1的最大子集的大小为dp[i][j]
// step3:初始化,dp数组全初始化为0即可,因此无需操作
int numOne;
int numZero;
// step4:确定遍历顺序
for (String str : strs) {
numOne = 0;
numZero = 0;
for (char c : str.toCharArray()){
if (c == '0') {
numZero++;
} else {
numOne++;
}
}
for (int i = m; i>=numZero;i--){
for (int j = n; j>=numOne;j--){
// step2:确定递推规律:dp[i][j]可由dp[i-numOne][j-numZero]+1推出
dp[i][j] = Math.max(dp[i][j], dp[i-numZero][j-numOne]+1);
}
}
}
return dp[m][n];
}
}