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

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

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

解法

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

动规五部曲

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

dp[j]表示容量为j的背包,最多可以背最大重量为dp[j]。

✒️确定递推公式

01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

本题则是------dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])

✒️dp数组初始化

初始为0即可

✒️确定遍历顺序

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

⭐️那么求dp[sum/2] ,即dp[target]即可!
那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。

时间复杂度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]));
    }
}   
相关推荐
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2342 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
pianmian12 小时前
python数据结构基础(7)
数据结构·算法
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
考试宝3 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
测开小菜鸟4 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫4 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
P.H. Infinity4 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天5 小时前
java的threadlocal为何内存泄漏
java
sp_fyf_20245 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘