01背包
Leetcode474(一和零)😍哪里有零

上图为题目简介,这个题目还是非常的硬核的,01背包的集大成者,相信做完这个题目,你一定知道01背包究竟改怎么解决了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public int findMaxForm(String[] strs, int m, int n) { int length = strs.length; int[][][] dp = new int[length + 1][m + 1][n + 1]; dp[0][0][0] = 0; int[][] arr = new int[length +1][2]; for (int i = 0; i < length; i++) { String str = strs[i]; for (int j = 0; j < str.length(); j++) { if (str.charAt(j) == '0') { arr[i+1][0]++; }else { arr[i+1][1]++; } } } for (int i = 1; i <= length; i++) { for (int j = 0; j <= m; j++) { for (int k = 0; k <= n; k++) { if (j >= arr[i][0] && k >= arr[i][1]) { dp[i][j][k] = Math.max(dp[i-1][j][k], dp[i-1][j-arr[i][0]][k-arr[i][1]] + 1); }else { dp[i][j][k] = dp[i-1][j][k]; } } } } return dp[length][m][n]; }
|
此题需用三维数组来解决,如果想优化空间复杂度,也可以使用滚动数组。重点:滚动数组记得使用倒序遍历,这样可以保证每个元素只被使用一次。
完全背包
理论
- 完全背包的滚动数组需要正序遍历
- 求组合数就是外层循环遍历物品,内层循环遍历背包
- 求排列数就是外层循环遍历背包,内层循环遍历物品