最后一块石头的重量 II
所有的粉碎石头的方案,化简到最后,就是用+和-连接着n个数字——也就是分成两堆。
所以,为了最后的石头重量最小,所以要尽可能凑成一半重量的石子堆。
DP得出能不能凑出某个重量的石子堆。
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0,n = stones.size(),res = 0;
for(int x:stones) sum += x;
bool dp[15010] = {
0};
dp[0] = 1;
for(int i=0;i<n;i++){
for(int j = sum/2;j>=stones[i];j--){
dp[j] |= dp[j-stones[i]];
}
}
for(int i=0;i<=sum/2;i++){
res = max(res,dp[i]?i:0);
}
return (sum-res)-res;
}
};