与 01 背包 分割子集的题目类似
这里的规则是求出碰撞后最小的石头是多少
求出这一堆石头总的重量 sum
首先就将这一堆石头尽量分成两堆一样重量, 重量: target = sum / 2
两堆 dp [target] sum - dp [target]
然后求这 两堆之差 sum - dp [target] - dp [target]
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int> dp(15001,0);
int sum = 0;
for(int a: stones)
{
sum += a;
}
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];
}
};