LeetCode 1049. 最后一块石头的重量 II (转化为01背包)

最后一块石头的重量 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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/109007136