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

article/2025/10/3 2:27:08

0-1背包问题

所谓0-1背包问题,也就是给你一个重量为M的背包和n种物品,每种物品有一定的重量和价值,在每种物品均可装入背包1次或不装入(不能仅装入物品的一部分)且不超过背包载重量的前提下,问你怎样选择物品,使得装入背包的物品的总价值最大?

网上关于0-1背包问题的解决办法非常多,但是上来就给公式,我觉得对于初学者来说非常不好理解,目前我觉得最好的方式就是图表法来快速理解这个问题,当然大家如果有更好的方法欢迎在评论区分享。

分析

我们先从一个例子入手:
假如现在有一个背包能够承重5kg,有四个物品重量和价值如下:

物品重量/kg价值
物品①310
物品②240
物品③430
物品④150

思路:对于每个物品,我们计算背包当前状态是否可以存放,如果能存放,则比较放入该物品的总价值和未放之前的总价值,如果该物品放入后比之前的总价值更大,则放入该物品,反之则不放。这样,当前状态所得到的总价值就是最大的。后面每放一个物品,我们都在前面计算的总价值最大的基础上再进行上述重复操作。

如图,横轴为背包重量,我们让背包重量从0开始,慢慢增长到5,分析每一个重量下可放入物品的最大价值;纵轴为我们的物品编号,我们总共有四个物品。当背包重量为0时,没有物品能够放入,背包的价值也就为0,所以表格第一列是0;当物品为0时,即没有东西放入背包,此时背包的价值也都是0,所以表格第一行都是0.(把0考虑进来的目的是方便计算和分析)
在这里插入图片描述
然后我们先判断物品①放入背包中的情况,由上述可知物品①重量为3,价值为10,当背包重承重为1或者2时物品①无法放入,所以最大价值是0,当背包承重为3、4、5时,物品①可以放入,所以背包最大价值是10,表格数据情况如下:
在这里插入图片描述
接着我们再判断放入第二个物品的情况,物品②重量为2,价值为40:

  • 当背包承重为1时,物品②无法放入,背包总价值为0
  • 当背包承重为2时,刚好可以放入物品②,此时背包最大价值为40
  • 当背包承重为3时,不放物品②的最大价值由上述计算得出是10(即放入物品①),放入物品②的最大价值是40,我们选择放入物品②
  • 背包承重为4时跟承重为3的情况一模一样,背包的最大价值还是40
  • 当背包承重为5时,这个时候物品①和物品②可以同时放入,所以背包的最大价值为10+40=50
    在这里插入图片描述
    第三个物品重量为4,价值为30,所以
  • 当背包承重为1,2,3时,物品③都无法放入,根据上述计算可知,背包承重为1时,没有物品能放入,最大价值是0,当背包承重为2或者3时,背包的最大价值为40(即上述放入物品②)
  • 当背包承重为4时,有两种情况,一种是放入物品③,此时背包价值为30,第二种情况就是不放入物品③,不放入物品③且当背包重量为4的时候我们计算出背包的最大价值为40,所以我们选择不放入。
  • 当背包重量为5时,同理,两种情况,放入物品③价值为30,不放物品③且背包重量为5的最大价值是50(上述计算得出),所以背包的最大价值还是50.
    在这里插入图片描述
    第四个物品重量为1,价值为50,所以
  • 当背包承重为1时,我们放入物品④价值最大,最大价值为50
  • 当背包承重为2时,我们有两个选择,,一是放入物品④最大价值为50,二是不放入物品④,此时最大价值是40(由上述计算可得是放入物品②)
  • 当背包承重为3时,不放入物品④的最大价值是40,放入物品④的最大价值是90(因为此时物品④和物品②可以同时放入)
  • 当背包承重为4、5时,最大价值还是90
    在这里插入图片描述
    到这里,我们就通过画图表进行分析的方式得到了我们背包可放置物品的最大总价值!

由上面的分析过程和表格,不知道各位小伙伴们有没有看出上面规律,其实上面的表格我们完全可以把它看成一个二维数组,这个二维数组里面记录了背包承重的不同情况下放入不同物品所得的最大价值。

假如,我们把这个二维数组定义为dp[ i ][ j ],当背包重为0时,没有物品能够放得下,所以背包价值为0即dp[ i ][ 0]={0},当没有物品放进背包时,背包的价值也是0,也即dp[ 0 ][ j ]={0},当我们有物品需要放入时,根据上述我们可以得到如下公式来推导出最大价值:
在这里插入图片描述
在这里插入图片描述

源代码

关注公众号百宝菌并回复:01背包问题
即可免费获得C++源码!
或者从csdn获取付费资源,编程不易,敬请见谅!
资源链接:https://download.csdn.net/download/David_house/86791128


http://chatgpt.dhexx.cn/article/0n9PxAFn.shtml

相关文章

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

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

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

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

java事务和分布式事务详解

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

JAVA事务配置总结

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

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

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

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

Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的 Transactional注解:只能拦截RuntimeException和Error异常) Transa…

java中事务

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

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

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

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

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

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

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

Java 事务的传播性(Transactional)

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

Java 事务应用

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

Java事务管理

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

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

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

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

Java中使用事务(注解实现) 事务的介绍 描述: 对于一个功能实现或者业务流程,要么全做,要么全不做! 特性: ACID A - 原子性:执行的最小单位,要么全做,要么全…

JAVA的事务

要先知道什么是java中的事务? 事务: 一般是指要做的或所做的事情.专业术语是这样说的: 就是代码逻辑上的一组操作,这些操作要么全部成功,要么全部失败!举一个现实生活当中的例子: 1张三账上有2000元,李四账号也有2000元。张三要向李四转账1000元,正常来…

Java中的事务

一、事务概述 1. 什么是事务 事务是指对数据库的一系列的操作序列,数据库应用系统通过事务集来完成对数据的存取操作。 2. 事务的特性(ACID原则) 原子性(Atomicity):一个事务的操作不可分割&#xff0c…

java事务总述

文章目录 一、java事务概述1.1、java事务简述1.2、Java事务的类型1.3、java事务的特性1.4、java事务的隔离级别1.5、spring事务的传播特性1.6、spring支持的事务管理类型 二、java事物使用2.1、XML配置2.2、事务使用方式 一、java事务概述 1.1、java事务简述 1、简介 事务(TR…

Java中的事务及使用

什么是事务? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C或Java&am…

测试用例设计方法---等价类划分法

1 等价类划分法 1.1 定义 是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。方法是一种重要的、常用的黑盒测试用例设计方法。 1.1划分等价类 1&a…