【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II

【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II

---------------🎈🎈题目链接🎈🎈-------------------

解法

[😒: 我的代码实现============>](#😒: 我的代码实现============>)

动规五部曲

✒️确定dp数组以及下标的含义

dpj表示容量为j的背包,最多可以背最大重量为dpj

✒️确定递推公式

01背包的递推公式为:dpj = max(dpj, dpj - weight\[i] + valuei);

本题则是------dpj = max(dpj, dpj - stones\[i] + stonesi)

✒️dp数组初始化

初始为0即可

✒️确定遍历顺序

正序遍历物品,倒序遍历背包
最后dptarget里是容量为target的背包所能背的最大重量。

⭐️那么求dpsum/2 ,即dptarget即可!
那么分成两堆石头,一堆石头的总重量是dptarget,另一堆就是sum - dptarget

时间复杂度O(N)
空间复杂度O(N)

📘代码

java 复制代码
class Solution {
    public int lastStoneWeightII(int[] stones) {
        // 得到总的重量
        int sum = 0;
        for(int stone:stones){
            sum += stone;
        }

// 希望尽可能凑出离total/2近的两组石头  =》 一组离total/2近, 那另一组也一定离total/2近
 // dp[j] : 装满容量为j的背包 能装下的最大重量为dp[j] 
        
        int total = sum/2;
        int[] dp = new int[total+1];

        for(int i = 0 ; i < stones.length; i++){ // 正序遍历物品
            for(int j = total; j>=stones[i]; j--){ // 倒序遍历背包
                dp[j] = Math.max(dp[j] , dp[j-stones[i]]+stones[i]);
            }
        }

        for(int j = 0; j <= total; j++){ // 倒叙遍历背包
            System.out.println(dp[j]);
        }

        return Math.abs(dp[total] - (sum-dp[total]));
    }
}   
相关推荐
营养充电站9 分钟前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑42 分钟前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
松仔log1 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才1 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li2 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
edwarddamon2 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
Raas1003 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway
Ivanqhz3 小时前
php8 use-def链
算法·php
spter。3 小时前
AI 面试相同请求为什么会重复调用,如何解决
人工智能·面试·职场和发展
evans在进步4 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring