| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 01背包问题(二维数组解法以及一位数组优化) -> 正文阅读 |
|
[数据结构与算法]01背包问题(二维数组解法以及一位数组优化) |
题目如下: 这个是本人最近接触的动态规划(dp)的一个基础题。 关于动态规划本人也只是有些许浅薄的理解,所以各位可以通过这篇文章来理解什么是动态dp 转自原文:http://www.cnblogs.com/sdjl/articles/1274312.html 那么回归正题,01背包二维数组应该怎么写呢? 我们根据题目,设置定义N为1005,定义二维数组f[N][N](列数下表用来记录放了几个物品,而列数下标表示背包体积,而这个数组记录的数值就是背包所有物品的价值),定义v[N],w[N],分别表示物品的体积以及物品的价值。 接下来我们讲下思路。 当我们的二维数组到达 f [ i ][ j ]时表示前 i 个物品,总体积为 j 的情况下,背包内的总价值; 而当我们选到了第 i 件物品的时候,我们有两种情况,一个是选择这件物品,一个是不选择该物品,这样我们需要一个限制条件来判断到底要不要选择该物品,而这个条件相信大家都会想到,那就是当选择到第 i 给物品的时候,我们背包的容积应该要大于等于该物品的体积,但是我们这里还有一个问题; 比如,我们背包的大小为5,而我们有两件物品,一个体积为3,价值为4,而另一个体积为5,但价值为5,我们根据最优选择,肯定会选择第二个,因此我们需要涉及一个问题,那就是比较丢掉背包的物品拿另一个物品后,背包内部的总价值和没拿新的物品放进背包的价值,来比较两者大小; 而这个问题,其实特别简单,当我们的 j 小于第 i 个物品的体积的时候,就让 f [ i ][ j ]记录 f [ i - 1] [ j ]? 的大小,这样就是记录下还不够体积时的背包内部价值,而当 j 大于等于第 i 个物品的体积的时候,我们就让 f [ i ][ j ]和 f [ i - 1][ j-v[ i ] ]+w[ i ]来比较 ,这样我们就知道到底要不要拿这个物品了。 之后我们就只需要在第 n 行时枚举一下,找到里面的最大值就行了 代码如下 :
如果大家对这里还有疑惑,也可以画一个图,简单的理解一下。 比如下面,我们输入四个物品,设置背包最大体积为10;根据状态转移方程,能够得出下图: 这个重点需要理解的是状态转移方程,这个状态转移方程先记录下当 背包容积不够时的总价值,然后当背包容积够的时候就能够根据之前保存的值来直接进行相关的运算,这样就能够直接判断需要拿哪些数据,需要丢掉哪些数据。 接下来时一维数组优化,一维数组优化方法实际上时通过滚动数组,每次到了一个新物品的选择环节是,就刷新滚动数组的值,来将最优解记录下来. 细心的小伙伴应该能够发现,这个二维数组实际上只和它的 j 有关,但是如果去除了 i 列(后无效性原则,只与上一条的数据有关),我们就无法来通过前面的数来判断是否取得该数,那么我们就只能从后往前来一个一个排,代码如下:
我这只是一些浅薄的知识,若有没有说明白的地方希望各位多多包涵。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:32:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |