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]; } };
|