2022-09-18 【我的刷题日记】 1049 最后一块石头的重量2

思路:本题如果想到使用01背包来解决,其就可转换为昨天分割等和数组的问题,按照题意,我们需要两两碰撞石头,将其重量相减,直到不剩石头或者只剩下一块石头,那么其本质上就是让我们分割出两堆重量最相似的石头,我们就可以按照分割等和数组的思路来解决,本题的体积和价值同样都是stones[i],所以我们只需要在返回值的时候做一点修改即可。
本题中dp[j]表示体积为j的背包最多可以放进去的石头重量,当我们把j设定为石头总和的一半的时候,dp[j]就表示了两个重量相近的石头堆中其中一个的重量和,sum-dp[j]就表示了另一个的重量和,在最后返回两者的差值即可

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum = 0;
        for(int stone : stones){
            sum += stone;
        }
//        最佳方案一定是分成重量相等的两堆
//        target就相当于每堆的目标重量也就是背包容量
        int target = sum/2;
        int[] dp = new int[target+1];
//        遍历物品
        for (int i = 0; i < stones.length;i++){
//            遍历背包
            for (int j = target; j >= stones[i];j--){
                dp[j] = Math.max(dp[j],dp[j - stones[i]] + stones[i]);
            }
        }
//        sum - dp[target] 和 dp[target]之间的差值就是最佳方案的结果
//        dp[target]表示容量为target的背包最多能装的重量
        return sum - dp[target] - dp[target];
    }
}

你可能感兴趣的:(2022-09-18 【我的刷题日记】 1049 最后一块石头的重量2)