01背包(修订版)

由于时间比较充裕,重新修订一部分。

这次把一些补充的放进来,其他的基础说明见后半部分

这些一共说明:01背包、完全背包、多重背包  将会详细说明。

三种背包混合、二维背包、分组背包、依赖背包、泛化背包 将大致说明。

 

01背包

如上次说明一般,这次提一下优化和其他说明

首先我做01背包的思路的是在背包价值固定的情况下,不断遍历增加物品,获取当前背包容量下课存放的最大价值

同时也有另一种做法:物品固定,遍历背包大小,获取该物品存放与否对总价值的影响。

后一种肯能优化更高一点 但不会太多,两者复杂度都是O(VN)

其中时间复杂度无法优化,但空间复杂度可以进行简单优化到O(N)

因为创建二维数组的目的是为了记录中间变量,每次记录当前行的值,下一次循环的时候与上一次的值进行比较。

那么就可以优化为以为一维数组,数组记录当前行的值,下一次循环的时候倒序判断,因为每次判断的值是上一行对应的值和上一行列数靠前的值加上物品的价值。

倒序遍历的时候可以把值进行覆盖更新,以便以后多次更新利用。

下面放上代码吧:

1 For(int i= 0, i<N; i++ ){
2    for(int j = U; j>Ti; j--}{
3       F[j] = Max(F[j], f[j-Ti]+Vi)
4    }
5 }

同样的需要进行初始化赋值。

这里提一下,之前以为赋值为0就好了,后来发现在大神们的思想里又对问题进行了细分

包括1.只求出最大价值,不要求必须袋子放满  2.恰好装满背包时最大价值

是不是感受到大神们满满的恶意

下面用原话来进行解释(我怕我解释不清楚)

我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目
要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别
这两种问法的实现方法是在初始化的时候有所不同。
如果是第一种问法,要求恰好装满背包,那么在初始化时除了F[0] 为0,其它
F[1::V ] 均设为?1,这样就可以保证最终得到的F[V ] 是一种恰好装满背包的最优解。
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将F[0::V ]
全部设为0。
这是为什么呢?可以这样理解:初始化的F 数组事实上就是在没有任何物品可以放
入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0 的背包可以在什
么也不装且价值为0 的情况下被“恰好装满”,其它容量的背包均没有合法的解,属于
未定义的状态,应该被赋值为-∞ 了。如果背包并非必须被装满,那么任何容量的背包
都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0
了。

 

完全背包

下面说一下完全背包,完全背包就是说物品的个数无限个,可以重复放置

这样就要求比较的时候不能与上一个相比,于是状态转移方程式就改为与当前行进行比较

valueData[i][j] = Max(valueData[i-1][j], valueData[i][j-weight[z]]+value[z]);

与01背包的区别是

因为物品存放无个数限制,完全可以多次放置,所以比较对象是当前物品放置历史最优值和不放置当前物品。

如此则完成完全背包的实现。

同样的  完全背包也可以进行空间复杂度的优化,原理与01背包相同。

 

多重背包

 多重背包的定义是物品个数有限个,并且说明当前物品个数。

状态转移方程式

1 valueData[i][j] = Max ( valueData[i-1][j - k*weight[i]] +k*value[i] )     0<=k<=num[i]

解释起来就是物品放置个数内求出最大价值

 


 

 混合三种背包

字面意思,三种背包都存在的混合体,有的物品只有一个(01背包),有的物品无限多个(完全背包)

有的物品有限多个(多重背包),这是可以将问题划为三分,分别把之前的背包封装起来,判断物品是哪一类分别调用不同的方法

最终求得最优解

二维背包

物品的属性有两个,要同时满足才可放进去,例如袋子存放物品既要考虑物品体积也要考虑物品重量

对应解决办法是创建的数组也增加维度,

详细的。。。。。不会

分组背包

意思多个物品被分组,且分组内物品相互排斥,只能取出一个

详细。。。。。不会

泛化背包

意思是物品没有固定价值和质量,物品的价值和质量随着分配的空间变化 ,。。。。。。不会

感觉就像液体水一样,好几种水,每个都是泛化对象,但又感觉不会这么简单。。。是在搞不懂大神们是怎么思考问题的

  OVER

背包问题说起来就是不断的在基础上提出新的问题,再不断解决、不断提问题

然后大神们津津乐道,我却疯掉了。。

 





 

以下是上次分享的内容

第一次分享,并不知道该拿出些什么,之前学的算法好像都还回去了。

最后祭出了背包,可是背包九讲又不全会,于是拿出了最简单的01背包。

话说。。。。01背包也忘了

开始复习ing。

 

1.01背包

首先01背包是对一个有固定容积的“”盒子“”进行物品存放,有N个物品,

每个物品的价值、体积分别是V1/T1、V2/T2、、、Vn/Tn。

需要求出能存放的最大价值。

按照固有思想,肯定放置性价比最高的,但是存在容积不匹配的情况

随便一个反例,有一个价值10、体积5和一个价值1体积1的物品,放在容量为4的袋子中。

如果选择倒推,则变成了暴力搜索了,时间复杂度就变大了。

 

在此基础上,机智的前辈们用贪心思想,加上动态规划完成了01背包。

将一个大问题的最优解,分解成一堆堆小问题的最优解,

要求得能放置的最大价值,对于每个物品求出放与不放的最优解。

例如对第i个物品,在能够放置的前提下,求出放这个物品和不放这个物品的最优值。

得到状态转移方程式:

F[i][j] = Max(F[i-1][j], F[i-1][j-Ti]+Vi);

举例说明:

两个0的初始化是为了放置数组越界出现异常。


完全背包、多重背包的拓展

完全背包:在01背包的基础上,每个物品可以无限制存放个数。

状态转移方程式改成与F[i][j-Ti]+Vi。

多重背包:在01背包基础上,每个物品可以放置有限次数且不固定。

01背包中存在价值体积相同的物品,可以转化为01背包思考。


剩下的几种,不会。。。。

转载于:https://www.cnblogs.com/yishilin/p/8397737.html

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

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

相关文章

java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

前言需求今天我们学习的是马踏棋盘算法&#xff0c;我们还是从一个场景里引入看看马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的66棋盘Board0&#xff5e;5的某个方格中提示&#xff1a;马按走棋规则(马走日字)进行移动要求&#xff1a;每个方格只进入一次&#xff…

app engine_App Engine中的Google Services身份验证,第2部分

app engine在本教程的第一部分中&#xff0c; 我介绍了如何使用OAuth进行Google API服务的访问/身份验证。 不幸的是&#xff0c;正如我稍后发现的那样&#xff0c;我使用的方法是OAuth 1.0&#xff0c;显然现在Google正式弃用了OAuth 1.0&#xff0c;改用OAuth 2.0版本。 显然…

Django知识总结(一)

壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等), 即浏览器请求消息和服务器响应消息的一系列规则 三 ● http协议的特性 http是无状态、无连接的协议(stateless, connect…

mysql+if+x+mod+2_Windows 下 MantisBT 2.X + Apache 2.4 + PHP 7 + MySQL 5.7 的环境配置

Apache 2.4.25~ Visual C Redistributable for Visual Studio 2015PHP 7.1.3~ mod_fcgid-2.3.9Mantisbt-2.2.1MySQL Database 5.7.17~ NET Framework 3.5安装 Apache前期准备1.若计算机已安装了 Apache2.4 以前的版本&#xff0c;请自行卸载并删除安装目录。2.以管理员身份运行…

如何在Java中对文件进行模式匹配和显示相邻行

最近&#xff0c;我们在jOOλ0.9.9中发布了有关超棒的窗口函数支持的文章 &#xff0c;我相信这是对我们所做的库的最佳补充。 今天&#xff0c;我们将在一个用例中研究窗口函数的出色应用&#xff0c;该用例受到以下堆栈溢出问题Sean Nguyen的启发&#xff1a; 如何从Java 8…

64位内核第二讲,进程保护之对象钩子

64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内核已经做了保护. 那么去掉保护的前提就是你要给自己的软件做保护. 比如我们给计算器做保护. 例如下图. 做保护.以前的病毒作者.都是想要退出…

jpql hql_无需部署即可测试JPQL / HQL

jpql hql您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL&#xff1f; 我们今天在这里看到的是适用于任何JPA实现的简单解决方案&#xff1a;Hibernate&#xff0c;OpenJPA&#xff0c;EclipseLink等。 这篇文章中找到的基本源代码来自本书&#xff1a;“ Pro JPA 2&a…

eclipse 代码上传github 笔记

第一步 先share project 如图所示 第二步 如果所示 第三步 点击 下面的create 然后点击完成 第四步提交 第五步&#xff1a; 第六步&#xff1a; 转载于:https://www.cnblogs.com/a8457013/p/8410471.html

Keycloak SSO集成到jBPM和Drools Workbench中

介绍 单一登录&#xff08;SSO&#xff09;和相关令牌交换机制正在成为Web上不同环境中进行身份验证和授权的最常见方案&#xff0c;尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成&#xff0c;以便使用Keycloak上提供的所有功能。 Keycloak是用于浏…

接口 java性能_接口测试性能测试

接口测试 接口测试是测试系统组件间接口的一种测试&#xff0c;主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 原理 通过测试程序模拟客户端向服务…

Redis 小结

一、redis简介 redis是一款基于C语言编写的&#xff0c;开源的非关系型数据库&#xff0c;由于其卓越的数据处理机制&#xff08;按照规则&#xff0c;将常用的部分数据放置缓存&#xff0c;其余数据序列化到硬盘&#xff09;&#xff0c;大家也通常将其当做缓存服务器来使用。…

NetBeans Java EE技巧#1 –数据库中的实体类

NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说&#xff0c;我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中&#xff0c;不仅Java EE的生产力提高了&#xff0c;而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBeans成为绝配&#x…

asp mysql添加数据_ASP:ado.net 实例向数据库添加数据。

我在这使用的是老师给的数据库1&#xff0c;web窗体设计。设计添加图书窗体&#xff0c;窗体属性有图书种类(下拉列表框控件)&#xff0c;图书名称&#xff0c;作者&#xff0c;编号&#xff0c;出版社&#xff0c;价格均为文本框&#xff0c;日期(第三方日期控件)&#xff0c;…

spring jmx_JMX和Spring –第1部分

spring jmx这是三篇文章的第一篇&#xff0c;这三篇文章将展示如何通过JMX支持为Spring应用程序赋能。 Maven配置 这是用于设置此示例代码的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

JAVA有percentile函数吗_Python numpy.percentile函数方法的使用

numpy.percentilenumpy.percentile(a, q, axisNone, outNone, overwrite_inputFalse, interpolationlinear, keepdimsFalse) [source]计算沿指定轴的数据的第q个百分位数。返回数组元素的第q个百分点。参数 &#xff1a;a &#xff1a;array_like输入数组或可以转换为数组的…

JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

运用JS的innerHTML&#xff0c;和for循环实现日历小部件内容和日期的转换。 <!DOCTYPE html> <html> <head><title>日历小部件</title><style type"text/css">*{padding: 0;margin:0;}.tab{width:220px;background: #ccc;height…

Django-认证系统

知识预览 COOKIE 与 SESSION用户认证 回到顶部COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&…

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xff0c;该应用程序用…

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…