class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
/*
题意分解:两两粉碎到最小 -> 将所有石头分为重量最为接近的两堆 -> 每堆的目标重量为总重量/2
dp[j] : 待定重量为 j , 在所有石头中选择得到的最大石头重量; dp[j] <= j;
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
*/
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]; // sum - dp[target] >= dp[target]
}
};
<Talk is cheap, show me the code 09> LeetCode.1049 最后一块石头的重量 II
最新推荐文章于 2024-09-10 23:34:31 发布