LeetCode 1049. 最后一块石头的重量 II
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1049. 最后一块石头的重量 II相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
if (j >= stones[i - 1]) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i - 1]] + stones[i - 1]);
} else {
//背包容量已经放不下了
dp[i][j] = dp[i - 1][j];
}
6}
但这道题并不是让求背包的最大容量,前面我们分析的是把数组分为两组,如果一组的值是x
,那么另一组的值就是sum-x
,他们的差值就是(sum-x)-x
;这个就是我们要求的值,而x
就是上面我们所求的背包的最大容量。
我们来看下最终代码
public int lastStoneWeightII(int[] stones) {
int length = stones.length;
int sum = 0;
for (int num : stones) {
sum += num;
}
//背包的容量
int capacity = sum >> 1;
//dp[i][j]表示前i个石头放进容量为j的背包所能获取的最大重量
int dp[][] = new int[length + 1][capacity + 1];
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= capacity; j++) {
//如果背包剩余容量能放下石头stones[i - 1],取把石头stones[i - 1]放进
//背包和不放进背包的最大值
if (j >= stones[i - 1]) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i - 1]] + stones[i - 1]);
} else {
//背包容量已经放不下石头了
dp[i][j] = dp[i - 1][j];
}
}
}
//sum - dp[length][capacity]是一部分,dp[length][capacity]是另一部分,上面
//capacity的取值是sum >> 1,往下取整,所以前面的肯定不小于后面的,不需要取绝对值
return (sum - dp[length][capacity]) - dp[length][capacity];
}
public int lastStoneWeightII(int[] stones) {
int length = stones.length;
int sum = 0;
for (int num : stones) {
sum += num;
}
//背包的容量
int capacity = sum >> 1;
int dp[] = new int[capacity + 1];
for (int i = 1; i <= length; i++) {
//这里要从大到小开始遍历
for (int j = capacity; j >= 1; j--) {
//如果背包剩余容量能放下石头stones[i - 1],取把石头stones[i - 1]放进
//背包和不放进背包的最大值
if (j >= stones[i - 1]) {
dp[j] = Math.max(dp[j], dp[j - stones[i - 1]] + stones[i - 1]);
}
}
}
return (sum - dp[capacity]) - dp[capacity];
}
以上是关于LeetCode 1049. 最后一块石头的重量 II的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题Python1049. 最后一块石头的重量 II