2023.8.13
与分割等和子集类似,可以转化为0-1背包问题。 本题也是需要将数组元素分成两堆,区别在于本题需要使这两堆的差值最小,而之前那题是需要两堆差值为0。
使用之前的一维dp数组的思路,代码如下:
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);
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]);
}
}
return sum-dp[target]-dp[target];
}
};