题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)
代码如下
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0;
vector<int> dp(1501,0);
for(int i = 0; i < stones.size(); i++)
{
sum += stones[i];
}
int target = sum / 2;
for(int i = 0; i < stones.size(); i++)
{
for(int j = target; j >= stones[i]; j--)
{
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
int result = sum - 2*dp[target];
return result;
}
};
这个题目的关键思想就是需要把这些石头能够以相差最小的值分成两堆,也就是说,分成两堆的石头每一堆的重量加起来再相减的和最小即可
这个题目没得说,也就是把所有的石头加起来,sum除以2,得到的值,作为背包的容量大小即可
这个题目要知道最后返回的值是有些考究的,返回是sum - 2*dp[target];,为什么呢,因为dp[target]是向下取整并且dp[target]是最小堆的石头,所以另一堆石头的重量就是sum-dp[target],两个石头堆相减,也就是最后的结果sum - 2*dp[target]