【动态规划】【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]));
    }
}   
相关推荐
LuminousCPP2 分钟前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法
qq7422349844 分钟前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash
QCodingDev13 分钟前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能·spring·ai·ai编程·企业ai
一嘴一个橘子15 分钟前
SpringDataRedis 操作 redis
java·redis
JasmineWr18 分钟前
Spring BeanDefinition 与 Bean 生命周期、循环依赖解析
java·后端·spring
dzl8439419 分钟前
微服务基座
java
QQ_216962909625 分钟前
【项目编号:project86564】SpringBoot供应链管理系统:采购、供应商、库存、销售、统计报表一体化实战
java·spring boot·后端
m0_5873830026 分钟前
课程培训系统开发实战:从技术选型到核心模块设计
java·spring boot·架构·系统架构
lskblog32 分钟前
Ubuntu 18.04 安装 LibreOffice(用于 Word 在线预览转换)
java·linux·python·ubuntu·word·php·laravel
TO_ZRG34 分钟前
Unity 编辑器之 SettingsProvider、Hierarchy、Project、SearchField
java·unity·编辑器