动态规划总结三01背包问题

article/2025/10/3 1:58:32

01背包问题一般是利用动态规划进行解题的,这里通过leetcode1049来讲解01背包的解题思路以及如何对01背包应用题目转换和理清思路


01背包问题:

这里借用学习公众号代码随想录的一张图来说明背包问题的种类
在这里插入图片描述
对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。
首先来看01背包问题的描述
有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
对于这种问题第一印象就是将所有可能的组合遍历出来,每一件物品都有取与不取两种状态,但是这种暴力解法的时间复杂度是O(2^N),对一半题目来说太高了,需要动态规划来降低复杂度。

解题思路:

1.还是从五步骤开始,先是定义数组,确定数组下标含义,在01背包问题中需要迭代更新的有两个变量是物品和重量,我们可以理解为在i个物品j重量的前提下,算出i+1个物品j重量的组合或者i个物品j+1重量的组合,所以数组的定义是dp[i][j]
在这里插入图片描述
2.那么可以有两个方向推出来dp[i][j],

由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]
由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值
所以递归公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

同时我们可以从递推公式中看到dp[i]的变化跟dp[i-1]行的变化有关,这种只跟前面一行状态以及当前行已经更新过的状态有关的情况下,可以将数组进行压缩变成一维数组即dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);对于已经被覆盖的数组,递推公式中是完全用不上的。后面为了方便讲解还是继续使用二维数组。
3.数组初始化
关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱。
我们看递推公式中dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])可以看出有两个要初始化的地方dp[i]的状态跟dp[i-1]有关,所有要初始化第0行即物品0号放入各种容量背包中重量大小,但是这里会在遍历中进行更新;还和j - weight[i]有j==weight[i]的情况,所以还要初始化dp[i][0]第0列,当容量为0时候,重量最大上限也是0,所以不用更改。综上所述,需要初始化的地方就是第0行。
首先我们要考虑01背包的条件,每个物品只有一件,不能重复放入,所以必须要从右往左进行倒序遍历,从左往右正序遍历会导致物品放入多次。
初始化递推dp[0][j] = dp[0][j - weight[0]] + value[0];举个反例:0号物品重量为1,如果是正序遍历的话,dp[0][0] = 0,dp[0][1] = 1,那么dp[0][2]=2,就相当于放入两次了。
4.遍历顺序
动态规划是比较看重遍历顺序的,遍历顺序不一样,可能得到的结果会完全不一样。但是在这里哪种遍历顺序都可以,先物品再容量和先容量再物品都可以。

leetcode:1049

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。
官方例子:
输入:[2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。

解析
咋一看,这题目跟01背包毫无关系,实际上需要转化思维方式,这是一道01背包的应用题。
首先两两石头进行粉碎,什么情况下能让剩下重量最小就是两块石头重量很接近的时候。那么这道题的解题思路就是将石头分成两堆,让他们重量相近,实际上就是重量少的那堆的重量总和尽量接近于原石头堆stones一半的重量。这就好办了,题目已经转化为背包所容纳的重量为stones/2,物品为石头数组的01背包问题。就可以利用上面01背包的解题思路进行解题了。
代码:

public int lastStoneWeightII(int[] stones) {int sums = 0;for(int i=0;i<stones.length;i++){sums += stones[i];}int sum = sums/2;int[] dp = new int[sum+1];for(int i=0;i<stones.length;i++){for(int j = sum;j>=stones[i];j--){dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);}}return (sums-dp[sum])-dp[sum];}

http://chatgpt.dhexx.cn/article/SrutBYG3.shtml

相关文章

dp 动态规划 01背包问题 Python

参考学习网址&#xff1a; https://www.bilibili.com/video/av33930433?fromsearch&seid10637513335818789097 https://www.cnblogs.com/anzhengyu/p/11408466.html 问题描述&#xff1a; 给定 n 件物品&#xff0c;物品的重量为 w[i]&#xff0c;物品的价值为 v[i]。现…

Python3使用动态规划处理01背包问题

文章目录 视频教程讲解题目介绍题解1&#xff1a;二维列表题解2&#xff1a;一维列表&#xff08;滚动数组&#xff09;延伸阅读 视频教程讲解 【Python算法系列】动态规划2-01背包问题&完全背包问题【Python算法实战】背包问题 题目介绍 原题链接&#xff1a;NC145 01背…

算法 动态规划 01背包问题

01背包 问题分析代码实现从前往后拿&#xff0c;递归实现非递归实现非递归实现&#xff0c;自上向下填充 允接上一文章内容&#xff1a; 算法 动态规划: link. 问题分析 按照普通思维&#xff0c;首先想到应该为贪心算法&#xff0c;也就是计算每个物品重量价值比&#xff0c;…

【动态规划】01背包问题

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位喜欢写作&#xff0c;计科专业大二菜鸟 &#x1f3e1;个人主页&#xff1a;starry陆离 &#x1f552;首发日期&#xff1a;2022年5月16日星期一 &#x1f30c;上期文章&#xff1a;【动态规划】最长上升子序列 &#x1f4…

01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

0-1背包问题 所谓0-1背包问题&#xff0c;也就是给你一个重量为M的背包和n种物品&#xff0c;每种物品有一定的重量和价值&#xff0c;在每种物品均可装入背包1次或不装入&#xff08;不能仅装入物品的一部分&#xff09;且不超过背包载重量的前提下&#xff0c;问你怎样选择物…

动态规划——0/1背包问题(全网最细+图文解析)

✨动态规划——0/1背包问题(全网最细图文解析) 作者介绍: &#x1f393;作者:青花瓷✨ &#x1f440;作者的Gitee:代码仓库 &#x1f4cc;系列文章推荐: ✨1.数据结构与算法—算法篇之动态规划(一) ✨2.【Java刷题特辑第一章】——【点进来花两把游戏的时间学习晚上睡觉都踏实了…

【动态规划】01背包问题(通俗易懂,超基础讲解)

问题描述 有n个物品&#xff0c;它们有各自的体积和价值&#xff0c;现有给定容量的背包&#xff0c;如何让背包里装入的物品具有最大的价值总和&#xff1f; 为方便讲解和理解&#xff0c;下面讲述的例子均先用具体的数字代入&#xff0c;即&#xff1a;eg&#xff1a;numbe…

java事务和分布式事务详解

目录 事务问题 1 Java事务的类型 2 spring事务实现源码分析 事务问题 面试经常会问到分布式锁、分布式事务、SOA 服务化、分布式系统等业务、架构的问题和解决方案&#xff0c;工作中接触的业务方面事关金融&#xff0c;也需要解决一些类似的业务问题&#xff0c;所以总结…

JAVA事务配置总结

JAVA事务配置总结 使用hibernate&#xff1a;1.本地事务动态数据源单sessionFactory 这种情况属于大部分项目配置&#xff0c;在这里不多谈 2.全局事务动态数据源单sessionFactory 数据库分库分表时使用&#xff0c;已解决了不同库中相同名字的表相同ID的数据同时出现在同一…

Java事务回滚问题:抛出异常事务,并返回给前端异常信息

1、背景 修改bug。 之前的开发写的只能单选&#xff0c;所以逻辑都是按照只需要传递一个id值的逻辑写的 现在改为多选时&#xff0c;传递过来的是id数组&#xff0c;所以直接原逻辑的外层加了一个循环&#xff0c;这样原逻辑包括sql就不需要大变动&#xff0c; 但是这样会有个…

java事务中使用try catch 导致事务不回滚的问题

Transactional注解的触发&#xff0c;只回滚RuntimeException和Error异常&#xff0c;默认不回滚非RuntimeException异常 解决方法&#xff1a; 1.方法前添加注解&#xff08;基础的 Transactional注解&#xff1a;只能拦截RuntimeException和Error异常&#xff09; Transa…

java中事务

1.开启事务 事务的四大特性 ACID是原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性 &#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;的缩写。 事务的原子性&#xff1a;事务作为整体执行&#x…

Java事务的ACID属性和四种隔离级别和传播机制

事务的ACID属性 数据库管理系统中事务(transaction)的四个特性&#xff08;分析时根据首字母缩写依次解释&#xff09;&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&a…

java回滚失败_java事务回滚失败问题分析

Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。 一切还是要从Java的检查型异常和非检查型异常说起。 那么什么是检查型异常什么又是非检查型异常呢? 最简单的判断点有两个: 1…

java中事务特性_java事务的四大特性ACID

前言 对于要把事务在实际中使用好&#xff0c;需要了解事务的特性。 事务的四大特性主要是&#xff1a;原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 一、事务的四大特性 1.1原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位&a…

Java 事务的传播性(Transactional)

前言 事务的传播性是Spring特有的概念&#xff0c;是基于Spring AOP技术实现的&#xff0c;原本的方法不具备事务的功能&#xff0c;运用Spring AOP的方式动态的增加了事务的功能&#xff0c;来确保数据库的数据的一致性。 只要开启事务的方法发生调用关系就一定存在事务的传…

Java 事务应用

一&#xff0c; 事务的一些基础知识简单回顾一下&#xff0c;讲的不是很深入&#xff0c;网上博客很多。 1&#xff0c;关于事务的四大特性&#xff1a;原子性、隔离性、一致性、持久性 本文不再赘述&#xff1b; 2&#xff0c;事务的隔离级别&#xff1a;读未提交&#xff0c;…

Java事务管理

事务的ACID属性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily) ACID 特性 A&#xff08;原子性&#xff09;事务的原子操作单元&#xff0c;对数据的修改&#xff0c;要么全部执行&#xff0c;要么全部不执行&#x…

java 事务级别_java事务隔离级别

事务隔离级别是由数据库系统实现的。 Java事务 1) 说到事务&#xff0c;不得不提的就是ACID特性&#xff0c;再次回顾&#xff1a; 原子性(atomicity)&#xff1a;组成事务处理的语句形成了一个逻辑单元&#xff0c;不能只执行其中的一部分。 一致性(consistency)&#xff1a…

Java中使用事务(注解实现)

Java中使用事务&#xff08;注解实现&#xff09; 事务的介绍 描述&#xff1a; 对于一个功能实现或者业务流程&#xff0c;要么全做&#xff0c;要么全不做&#xff01; 特性&#xff1a; ACID A - 原子性&#xff1a;执行的最小单位&#xff0c;要么全做&#xff0c;要么全…