boxmoe_header_banner_img

Hello! 欢迎来到不如画七的空间!

加载中

文章导读

14. 最后一块石头的重量Ⅱ


avatar
ensiezadi 2025年9月8日 22

最后一块石头的重量Ⅱ

题目

实际上就是石头可能存在不能完全打碎的情况,如果能打碎:看那个位置能放多少,


具体思路

  1. 遍历数组,找到背包的容量:整个大小的一半;
  2. 通过 01背包 问题找到当前容量最多可以放多少;
  3. 返回的就是 total - dp[space] * 2

具体实现

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int total = 0;
        for (int i = 0; i < stones.length; i++) {
            total += stones[i];
        }

        int space = total / 2;
        int[] dp = new int[space + 1];
        for (int i = 0; i < stones.length; i++) {
            for (int j = space; j > 0; j--) {
                if (j >= stones[i]) {
                    dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
                }
            }
        }
        return total % 2 == 0 && dp[space] == space ? 0 : total - 2 * dp[space];
    }
}

这里的更新条件是 大于等于

        return total - 2 * dp[space]; 可以直接返回这个,因为如果装满的


class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for (int i = 0; i < stones.size(); i++) {
            sum += stones[i];
        }

        int target = sum;
        sum /= 2;

        vector<int> dp(sum + 1, 0);

        for (int i = 0; i < stones.size(); i++) {
            for (int j = sum; j > 0; j--) {
                if (j >= stones[i])
                    dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
            }
        }

        return target - 2 * dp[sum];
    }
};


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码
不如画七
2025 年 10 月
 123456
78910111213
14151617181920
21222324252627
282930