题目描述
这个题的难点在于如何将其转换成背包问题(肯定是有理有据的推出来)
题目要求的是每粉碎两块石头,最后剩下其重量。那么我们宏观来看,将整堆石头尽可能的分为重量相等的两个部分,那么这样可以最大情况的将其碰撞掉
因为问题就转换成leetcode 416.分割等和子集这个题目了
这个的思路以及分析方法在这篇博客里
代码实现
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int> dp(1501, 0);
int sum = 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]);
}
}
return sum - dp[target] - dp[target];
}
};