背包月
本月是背包月,接连出了好几个背包问题,其难点在于对于问题的建模和分析。
比如下面两道题:
这两道题的不同点在于:
前者是求大小,而后者是求数量。
又比如下面这道题:
它的解法实际上就是一个典型的求大小的01背包问题——容量有限情况下的问题,而难点在于“建模”。
下面这道题:
讲的是背包排列与组合的问题。
又比如背包问题的变种:
这是无限可拿的完全背包问题,容量有限而可装背包的物品是充足供应的。
背包容量可变的问题。
下面来一一介绍和说明一下它们需要注意的点。
背包:大小与数量
- 求大小:474. 一和零
这是一个典型的经典01背包问题,只不过有两个变量0的数量和1的数量,直接用三维dp求解即可。
import java.util.*;
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
for (String str : strs) {
int zero = countZero(str);
int one = str.length() - zero;
for (int i = m; i >= 0; i--) {
for (int j = n; j >= 0; j--) {
if (i < zero || j < one) {
continue;
}
dp[i][j] = Math.max(dp[i - zero][j - one] + 1,dp[i][j]);
}
}
}
return dp[m][n];
}
public int countZero(String str) {
int count = 0;
for (char c : str.toCharArray()) {
if (c == '0') count++;
}
return count;
}