1049. 最后一块石头的重量 II
本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。
视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili
class Solution {
public int lastStoneWeightII(int[] stones) {
int total = 0;
for (int stone : stones) {
total += stone;
}
int halfTotal = total >>> 1;
int[] dp = new int[halfTotal + 1];
for (int i = 0; i < stones.length; i++) {
for (int j = halfTotal; j >= stones[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
return total - 2 * dp[halfTotal];
}
}
494. 目标和
大家重点理解 递推公式:dp[j] += dp[j - nums[i]],这个公式后面的提问 我们还会用到。
视频讲解:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和_哔哩哔哩_bilibili
class Solution {
public int findTargetSumWays(int[] numbers, int target) {
int total = 0;
for (int num : numbers) total += num;
if (Math.abs(target) > total) return 0;
if ((target + total) % 2 == 1) return 0;
int halfTotal = (target + total) / 2;
int[] ways = new int[halfTotal + 1];
ways[0] = 1;
for (int i = 0; i < numbers.length; i++) {
for (int j = halfTotal; j >= numbers[i]; j--) {
ways[j] += ways[j - numbers[i]];
}
}
return ways[halfTotal];
}
}
474.一和零
通过这道题目,大家先粗略了解, 01背包,完全背包,多重背包的区别,不过不用细扣,因为后面 对于 完全背包,多重背包 还有单独讲解。
视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零_哔哩哔哩_bilibili
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
int onesCount, zerosCount;
for (String str : strs) {
onesCount = 0;
zerosCount = 0;
for (char ch : str.toCharArray()) {
if (ch == '0') zerosCount++;
else onesCount++;
}
for (int i = m; i >= zerosCount; i--) {
for (int j = n; j >= onesCount; j--) {
dp[i][j] = Math.max(dp[i][j], dp[i - zerosCount][j - onesCount] + 1);
}
}
}
return dp[m][n];
}
}