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…

java数组使用实验报告_JAVA数组与类的定义-java实验报告

JAVA数组与类的定义-java实验报告JAVA数组与类的定义-java实验报告、实验目的与要求1、 熟悉Java类、对象和方法的一般操作练习等。2、 熟悉数组等的定义和使用。二、实验内容及步骤(包括源程序和运行结果截图)1. 编写Java小应用程序&#xff0c;程序中自定义一个方法&#xff…

JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

Java EE 7已经存在了几年&#xff0c;它提供了一些非常有用且期待已久的功能&#xff0c;例如实体图以及对存储过程和结果映射的更好支持。 有关概述&#xff0c;请参阅Thorben Janssen的博客文章 。 但是&#xff0c;我想添加有关JPA查询语言功能的更详细的摘要。 在JPQL和Cri…

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.以管理员身份运行…

ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性

一、ActionMethodSelectorAttribute 其是一个抽象类&#xff0c;继承自Attribute&#xff0c;子类有NonActionAttribute、HttpGetAttribute、HttpPostAttribute、HttpPutAttribute、HttpDeleteAttribute、HttpPatchAttribute、HttpHeadAttribute、HttpOptionsAttribute和Accept…

java 中map_Java中Map集合

1. Java中Map集合1. Map中value可以重复&#xff0c;key不能重复。对于重复的key值来说&#xff0c;后放置的值对覆盖前放置的值。import java.util.HashMap;public class MapTest1{public static void main(String[] args){HashMap map new HashMap();map.put("a",…

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

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

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

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

java 类 request_java普通类得到request对象

使用拦截器import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.…

Xamarin.Forms Button长按事件

Xamarin.Forms Button长按事件 在平时的开发中&#xff0c;我们经常遇到需要Button能够拥有长按事件&#xff0c;但是在Xamarin.Forms中Button并没有该事件&#xff0c; 此时我们如何来实现呢&#xff1f; 我们知道在Xamarin.Forms中可以通过CustomRenderer来根据不同平台各自处…

java对象写入文件_将Java对象写入文件中

Java对象序列化 首先介绍一下对象序列化的目标:对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。 一、序列化的含义和意义: 序列化机制使得对象可以脱离程序的运行而独立存在。 对象的序列化指将一个Java对象写入IO流中,与此对应的反是,对象的反序列化…

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

java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

笔者以前学过C语言。众所周知&#xff0c;C也是一门面向对象程序设计语言。还记得当时在大学的时候&#xff0c;老师讲过这样的话&#xff1a;类的构造函数不应该设置成private权限&#xff0c;这样的话还怎么去实例化类的对象&#xff1f;当时也信以为然。现在在学java&#x…

[Usaco2008 Feb]Eating Together麻烦的聚餐

Description 为了避免餐厅过分拥挤&#xff0c;FJ要求奶牛们分3批就餐。每天晚饭前&#xff0c;奶牛们都会在餐厅前排队入内&#xff0c;按FJ的设想所有第3批就餐的奶牛排在队尾&#xff0c;队伍的前端由设定为第1批就餐的奶牛占据&#xff0c;中间的位置就归第2批就餐的奶牛了…

Keycloak SSO集成到jBPM和Drools Workbench中

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

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

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

C 标准库 - string.h

C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays.string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。库变量 size_t Unsigned integral type (type )这是无符号整数类型&#xff0c;它是 sizeof 关键…