思路
尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了,背包承受重量为石头总重量的一半。本题物品的重量为store[i],物品的价值也为store[i]。
代码
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int n = stones.size();
int sum = 0;
for (int i = 0; i < n; i++)
sum += stones[i];
int target = sum / 2;
vector<int> dp(target + 1, 0);
for (int i = 0; i < n; 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];
}
};