01背包问题简单思路

问题描述:给你一个体积为5的背包,要求将下列物品中的一个或多个装入背包,使背包能有最大价值(每个物品有且仅有一个)。物品1:体积1,价值2物品2:体积2,价值4物品3:体积3,价值4物品4:体积4,价值5

文章目录

  • 代码




物品编号为0表示该物品大小为0,价值为0,用来辅助的。
物品编号\背包体积012345
0
1a
2
3b
4

表格中的a表示:当背包体积为1时,且只有两个物品供选择时(物品0和物品1),背包的最大价值

表格中的b表示:当背包体积为4时,且只有四个物品供选择时(物品0、物品1、物品2、物品3),背包的最大价值






知道这个表格的意义之后我们就逐个来填写。首先,

第一行全为0:因为不管背包体积有多大,只有物品0可供选择

第一列全为0:因为不管有多少个物品可以选择,背包的体积始终为0

物品编号\背包体积012345
0000000
10
20
30
40




然后就按顺序从左到右,从上到下的顺序填写。

填写的过程中需要考虑两种情况(与当前所能选择最大编号物品有关):

  • 情况1:若最大编号物品的体积大于当前背包体积
最大编号物品肯定是放不进背包的,于是我们就要去找,同体积背包下,排除最大编号物品,背包的最大价值。
  • 情况2:若最大编号物品的体积小于等于当前背包体积
如果是这种情况,我们又要将其细分为两种情况:- 不装入最大编号物品如果不装入,那么跟情况1一样,同体积背包下,排除最大编号物品,背包的最大价值- 装入最大编号物品如果装入,那么就去找减去该物品体积后,背包剩余体积的最大价值。(找背包剩余体积最大价值时,一定要排除最大编号物品,因为它已经装入背包了)。然后将该物品价值与背包剩余体积的最大价值相加。- 然后将装入与不装入的背包价值相比较,取较大者

下面来逐步填写





物品编号\背包体积012345
0000000
10
20
30
40

当背包体积为1,最大编号物品为1时,物品体积<=背包体积:

  • noInputValue:不装入物品1,找同背包体积下,排除物品1,背包的最大价值,那么对应着表格中的(0,1),于是noInputValue=0
  • InputValue:装入物品1,减去它的体积,背包剩余体积为0,排除物品1,背包剩余体积最大价值的位置就在(0,0),InputValue=物品价值+背包剩余体积最大价值=2+0=2
  • noInputValue < InputValue:将大的值填入(1,1)





物品编号\背包体积012345
0000000
102
20
30
40

当背包体积为2,最大编号物品为1时,物品体积<=背包体积:

  • noInputValue:不装入物品1,找同背包体积下,排除物品1,背包的最大价值,那么对应着表格中的(0,2),于是noInputValue=0
  • InputValue:装入物品1,减去它的体积,背包剩余体积为1,排除物品1,背包剩余体积最大价值的位置就在(0,1),InputValue=物品价值+背包剩余体积最大价值=2+0=2
  • noInputValue < InputValue:将大的值填入(1,2)

然后按照此规则,将这一行填完:





物品编号\背包体积012345
0000000
1022222
20
30
40

当背包体积为1,最大编号物品为2时,物品体积>背包体积:

  • Value:不装入物品2,找同背包体积下,排除物品2,背包的最大价值,那么对应着表格中的(1,1),于是Value=2,将2填入(2,1)





物品编号\背包体积012345
0000000
1022222
202
30
40

当背包体积为2,最大编号物品为2时,物品体积<=背包体积:

  • noInputValue:不装入物品2,找同背包体积下,排除物品2,背包的最大价值,那么对应着表格中的(1,2),于是noInputValue=2
  • InputValue:装入物品2,减去它的体积,背包剩余体积为0,排除物品2,背包剩余体积最大价值的位置就在(1,0),InputValue=物品价值+背包剩余体积最大价值=4+0=4
  • noInputValue < InputValue:将大的值填入(2,2)





物品编号\背包体积012345
0000000
1022222
2024
30
40

当背包体积为3,最大编号物品为2时,物品体积<=背包体积:

  • noInputValue:不装入物品2,找同背包体积下,排除物品2,背包的最大价值,那么对应着表格中的(1,3),于是noInputValue=2
  • InputValue:装入物品2,减去它的体积,背包剩余体积为1,排除物品2,背包剩余体积最大价值的位置就在(1,1),InputValue=物品价值+背包剩余体积最大价值=4+2=6
  • noInputValue < InputValue:将大的值填入(2,3)





物品编号\背包体积012345
0000000
1022222
20246
30
40

然后按照此规则,将这一行填完:





物品编号\背包体积012345
0000000
1022222
2024666
30
40

当背包体积为1,最大编号物品为3时,物品体积>背包体积:

  • Value:不装入物品3,找同背包体积下,排除物品3,背包的最大价值,那么对应着表格中的(2,1),于是Value=2,将2填入(3,1)





物品编号\背包体积012345
0000000
1022222
2024666
302
40

当背包体积为2,最大编号物品为3时,物品体积>背包体积:

  • Value:不装入物品3,找同背包体积下,排除物品3,背包的最大价值,那么对应着表格中的(2,2),于是Value=4,将4填入(3,2)





物品编号\背包体积012345
0000000
1022222
2024666
3024
40

当背包体积为3,最大编号物品为3时,物品体积<=背包体积:

  • noInputValue:不装入物品3,找同背包体积下,排除物品3,背包的最大价值,那么对应着表格中的(2,3),于是noInputValue=6
  • InputValue:装入物品3,减去它的体积,背包剩余体积为0,排除物品3,背包剩余体积最大价值的位置就在(2,0),InputValue=物品价值+背包剩余体积最大价值=4+0=4
  • noInputValue > InputValue:将大的值填入(3,3)





物品编号\背包体积012345
0000000
1022222
2024666
30246
40

当背包体积为4,最大编号物品为3时,物品体积<=背包体积:

  • noInputValue:不装入物品3,找同背包体积下,排除物品3,背包的最大价值,那么对应着表格中的(2,4),于是noInputValue=6
  • InputValue:装入物品3,减去它的体积,背包剩余体积为1,排除物品3,背包剩余体积最大价值的位置就在(2,1),InputValue=物品价值+背包剩余体积最大价值=4+2=6
  • noInputValue > InputValue:将大的值填入(3,4)





物品编号\背包体积012345
0000000
1022222
2024666
302466
40

当背包体积为5,最大编号物品为3时,物品体积<=背包体积:

  • noInputValue:不装入物品3,找同背包体积下,排除物品3,背包的最大价值,那么对应着表格中的(2,5),于是noInputValue=6
  • InputValue:装入物品3,减去它的体积,背包剩余体积为2,排除物品3,背包剩余体积最大价值的位置就在(2,2),InputValue=物品价值+背包剩余体积最大价值=4+4=8
  • noInputValue > InputValue:将大的值填入(3,5)





物品编号\背包体积012345
0000000
1022222
2024666
3024668
40

然后按照此规则,将最后一行填完:





物品编号\背包体积012345
0000000
1022222
2024666
3024668
4024668

至此结束。只要按照前面说的规则来,就很好理解。




代码

# 背包大小
bagSize = 5# 存放每个物品的体积和价值,objects[0][0]表示物品1的体积,objects[0][1]表示物品1的价值
objects = [[1, 2], [2, 4], [3, 4], [4, 6]]def ZeroOneBags(bagSize, objects):""":param bagSize: 背包最大体积:param objects: 物品的体积和价值数组:return: 返回最大价值表格"""# 初始化表格,每一个格子都为0,主要是为了让第一行和第一列的格子为0maxValueList = [[0] * (bagSize + 1) for i in range(0, len(objects) + 1)]# i表示物品编号,从物品1开始for i in range(1, len(maxValueList)):# j表示假设体积为j的背包,从体积为1开始for j in range(1, len(maxValueList[0])):# 1. 如果最大编号物品的体积大于当前背包体积if objects[i - 1][0] > j:# 不装入该物品,直接找排除该物品,背包的最大价值填入maxValueList[i][j] = maxValueList[i - 1][j]continue# 2. 如果最大编号物品的体积小于或等于当前背包体积,分两种情况# 2.1 将此物品放入背包,然后计算能产生的最大价值# 2.1.1 得到该物品体积和价值objVol, objValue = objects[i - 1][0], objects[i - 1][1]# 2.1.2 计算背包剩余体积所能产生的最大价值surplusValue = maxValueList[i - 1][j - objVol]# 2.1.3 计算放入该物品所能产生的总价值inputValue = objValue + surplusValue# 2.2 不将此物品放入背包,排除该物品,找同体积下背包的最大价值noInputValue = maxValueList[i - 1][j]# 2.3 比较两者,取较大值maxValueList[i][j] = inputValue if inputValue > noInputValue else noInputValuereturn maxValueListmaxValueList = ZeroOneBags(bagSize, objects)
# 打印表格
print(maxValueList)
# 打印背包最大价值
print(maxValueList[-1][-1])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小迪安全第二天

文章目录 一、Web应用&#xff0c;架构搭建二、web应用环境架构类三、web应用安全漏洞分类总结 一、Web应用&#xff0c;架构搭建 #网站搭建前置知识 域名&#xff0c;子域名&#xff0c;dns,http/https,证书等 二、web应用环境架构类 理解不同web应用组成角色功能架构 开发…

显示CPU架构的有关信息 lscpu

文章目录 显示CPU架构的有关信息 lscpu默认实例更多信息 显示CPU架构的有关信息 lscpu Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。 lscpu从sysfs和/proc/cpuinfo收集cpu体系结构信息&#xff0c;命令的输出比较易读 。 命令输出的信息包含cpu数量&#xff0c;线…

tensorflow报错: DNN library is no found

错误描述 如上图在执行程序的时候&#xff0c;会出现 DNN library is no found 的报错 解决办法 这个错误基本上说明你安装的 cudnn有问题&#xff0c;或者没有安装这个工具。 首先检测一下你是否安装了 cudnn 进入CUDA_HOME下&#xff0c;也就是进入你的cuda的驱动的安装目…

个人数据备份方案分享(源自一次悲惨经历)

文章目录 1 起源2 备份架构2.1 生活照片2.2 生活录音2.3 微信文件2.4 工作文件2.5 笔记、影视音乐、书籍 3 使用工具介绍3.1 小米云服务3.2 中国移动云盘3.3 小米移动硬盘&#xff08;1T&#xff09;3.4 FreeFileSync 4 总结 1 起源 本文的灵感源于我个人的一次不幸遭遇&#…

机器学习之集成学习 XGBoost(eXtreme Gradient Boosting)附代码

概念 XGBoost(eXtreme Gradient Boosting)是一种用于机器学习的开源软件库,它实现了梯度提升框架。梯度提升是一种集成学习技术,通过组合多个弱学习器(通常是决策树)来构建一个强学习器。XGBoost 在梯度提升算法的基础上引入了一些创新,使其在性能上更为优越。 特点 …

Selenium操作网页时,如何获取元素的CSS选择器?

1.案例 输入文本操作的元素的CSS选择器怎么获取&#xff0c;用https://passport.baidu.com/v2/?login演示 2.分析 要获取元素的CSS选择器&#xff0c;可以使用浏览器的开发者工具来查看页面的HTML结构和元素属性。以下是在Chrome浏览器中获取元素CSS选择器的步骤&#xff1…

领域驱动设计——DDD领域驱动设计进阶

摘要 进阶篇主要讲解领域事件、DDD 分层架构、几种常见的微服务架构模型以及中台设计思想等内容。如何通过领域事件实现微服务解耦&#xff1f;、怎样进行微服务分层设计&#xff1f;、如何实现层与层之间的服务协作&#xff1f;、通过几种微服务架构模型的对比分析&#xff0…

记一个有关 Vuetify 组件遇到的一些问题

Vuetify 官网地址 所有Vuetify 组件 — Vuetify 1、Combobox使用对象数组 Combobox 组合框 — Vuetify items数据使用对象数组时&#xff0c;默认选中的是整个对象&#xff0c;要对数据进行处理 <v-comboboxv-model"defaultInfo.variableKey":rules"rules…

基于springboot体育场馆运营管理系统源码

基于springboot体育场馆运营管理系统源码330 -- MySQL dump 10.13 Distrib 5.7.31, for Linux (x86_64) -- -- Host: localhost Database: springboot3cprm -- ------------------------------------------------------ -- Server version 5.7.31/*!40101 SET OLD_CHARACT…

网络安全全栈培训笔记(53-WEB攻防-通用漏洞CRLF注入URL重定向资源处理拒绝服务)

第53天 WEB攻防-通用漏洞&CRLF注入&URL重定向&资源处理拒绝服务 知识点&#xff1a; 1、CRLF注入-原理&检测&利用 2、URL重定向-原理&检测&利用 3、Web拒绝服务-原理&检测&利用 #下节预告&#xff1a; 1、JSONP&CORS跨域 2、域名安全…

嵌入式软件工程师面试题——2025校招社招通用(十八)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

共识算法介绍

文章目录 共识算法Paxos 算法三种角色一致性提交算法prepare 阶段accept 阶段commit 阶段 CAP 定理BASE 理论Zookeeper 算法实现三类角色三个数据三种模式四种状态消息广播算法Leader选举算法 共识算法 Paxos 算法 Paxos 算法是莱斯利兰伯特(Leslie Lamport)1990 年提出的一种…

基于Java (spring-boot)的社团管理系统

一、项目介绍 系统管理员的功能概述&#xff1a; ①用户管理 a.注册用户账户 当一个新用户注册时&#xff0c;用户填写基本信息并上传。用户基本信息包括账号、 姓名、密码、手机、地址等信息。 b.用户信息管理 管理员可以查看系统所有用户的基本信息&#xff0c;并修改和…

面试官常问问题:Java中的128陷阱详解

看这样两段代码&#xff0c;思考结果返回的是什么 Integer num1 100; Integer num2 100; System.out.println(num1 num2);Integer num3 128; Integer num4 128; System.out.println(num3 num4); 揭晓答案&#xff1a;第一段代码的结果是true&#xff0c;第二段代码的结…

数据结构学习 jz59 滑动窗口的最大值

关键词&#xff1a;排序 大顶堆 双端队列 题目&#xff1a; 望远镜中最高的海拔 方法一&#xff1a;维护一个辅助队列。 方法二&#xff1a;大顶堆。 我还在主站 239 写了找最小值的方法。 方法一&#xff1a;最优解 这个方法和jz30维护一个非严格递减的辅助栈是基本一样的…

条款24:若所有参数皆需类型转换,请为此采用非成员函数

设计一个表示有理数的类时&#xff0c;允许从整数隐式转换为有理数是有用的&#xff1a; class Rational { public:Rational(int numerator 0, // 该构造函数没有explicit限制;int denominator 1); int numerator() const; int denominator() const; const Rational opera…

计划——不做计划

今天想讲一下我做计划这件事。 2024 年已经过了两个星期了&#xff0c;毕竟自己也到了一个新的阶段&#xff0c;想着也可以搞个计划&#xff0c;写写自己未来一年计划做的事情。 但回忆了过去这半年来我所做的计划&#xff0c;我的双手抚摸着键盘&#xff0c;迟迟动不了手。 …

数据结构:队列的链表结构(含完整代码,可复制)

1.输出队列 void outlin(LinkQueue qq) {pqq.front->next;while(p!NULL){printf(" data%4d\n",p->data);pp->next;}printf("\n outend \n\n"); } 2.入队一个元素 void insert(LinkQueue *qe,int x) {s(NodeType *)malloc(sizeof(NodeType));s-…

分布式系统中的CAP原理

分布式系统中的CAP原理 本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 简介 在分布式系统中&…

【LeetCode】206. 反转链表(简单)——代码随想录算法训练营Day03

题目链接&#xff1a;206. 反转链表 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…