1049. 最后一块石头的重量 II

Problem: 1049. 最后一块石头的重量 II

思路

说实话一开始我没有看出来,这G8题目与动态规划和分割等和子集的关系。

知道看代码随想录我才看出来。

这道题目要找到的也是,分割出来的左右子集的值最接近的一组。

需要注意的是返回值,找到能装一半物品的背包,计算差值,sum - dp[target] 是一边 dp[target] 是另外一边。

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0;
for(int i = 0; i < stones.size(); i++) {
sum += stones[i];
}
int target = sum / 2;
vector<int> dp(target+1,0);
for(int i = 0; i < stones.size(); i++) {
for(int j = target; j >= 0; j--) {
if(j >= stones[i]) {
dp[j] = std::max(dp[j],dp[j - stones[i]] + stones[i]);
}
}
}
return sum - dp[target] - dp[target];
}
};