算法笔记(c++)--关于01背包的滚动数组
算法笔记(c++)--关于01背包的滚动数组
关于01背包问题:基本方法我这篇写过了。
https://www.cnblogs.com/DJC-BLOG/p/9416799.html
但是这里数组是N^2,据说滚动数组可以用1维来代替二维。
我想了想也没想通。干脆老方法,一步步列出来就懂了。
先上下滚动数组的代码,然后分析代码:
dp[N];//这里只用一维的
for(int i=; i<=n; i++)//对每个数判断,可反
{
for(int j=m; j>=weight[i]; j--)/
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
}
这里用到还是熟悉的数据熟悉的内容:
| 体积 | 价值 |
| 0 | 0 |
| 4 | 8 |
| 6 | 10 |
| 2 | 6 |
| 2 | 3 |
| 5 | 7 |
| 1 | 2 |
然后开始循环,先说下代码里面的n是物品,m是背包容量:,真实的值是n=6,m=12
1)
最初i=1,j=16表示只有1号物品也就是(4-8),背包容量为16时候。这时候dp[12]=max(dp[12],dp[12-4(1号物品体积)+8(1号物品价值)])=8;
这样一直到m[1][4]都是8,。当包容量小于此时1号物品容量时候跳出循环。这时候m[1][j]就是【0,0,0,8,8,8,8,8,8,8,8】
2)
这是第二次n循环,这时候i=2,包含了一号物品和二号物品,二号物品为6-10;此时包可以装下
dp[12]=max(dp[12],dp[12-6]+10)=dp[12-6]为8所以这dp[12]=18.同理dp[10]dp[11]都是18。
dp[9]-dp[6]时候 比如max(dp[9],dp[9-6]+10)=dp[3]为0所以最终为10。没问题的话最终【0,0,0,8,8,8,10,10,10,18,18】.
3)到这里气候就差不多了,下面都是类似的。
看起来没什么问题了。
不用滚动数组的话代码这样

这就是上一次的数值。滚动数组是把它保留了然后从后往前更新,直到背包容量小于物品容量的话更新就不用了,直接拿上一次就好了。
算法笔记(c++)--关于01背包的滚动数组的更多相关文章
- POJ3624 0-1背包(dp+滚动数组)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47440 Accepted: 20178 ...
- NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- [算法]用java实现0-1背包和部分背包问题
问题描述: 0-1背包问题,部分背包问题(课本P229)实验要求: (1)实现0-1背包的动态规划算法求解 (2)实现部分背包的贪心算法求解 0-1背包问题代码: public static void ...
- hdu2126 类01背包(三维数组的二维空间优化)
题目描述: 对于给出的n个物品,每个物品有一个价格p[i],你有m元钱,求最多能买的物品个数,以及有多少种不同的方案 题目分析: 类似01背包的题目,一般的01背包问题我们遇到的是求n个物品,有m的容 ...
- hdu 2955 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...
- nyoj 203 三国志 dijkstra+01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203 思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了 我奇怪的 ...
- 第K大01背包
其实这个问题,真的挺好想的,但是我咋想了那么久呢~~ 很好理解,第K大01背包一定基于01背包,dp数组也很容易的想到由dp[V] ----> dp[V][K],来表示背包容量是V时候的第 ...
- HDU 1171Big Event in HDU(转01背包)
题意: 给你一组数,分成差距最小的两份A,B(A>=B) 分析: 转01背包 注意: 01背包用一维数组 不要用二维 二维数组若是开太大,内存超限,开太小,RE #include "c ...
随机推荐
- oracle的建表语句
oracle数据库的建表语句,具体语法如下: CREATE TABLE tablename (column_name datatype [null,not null], column_name dat ...
- iOS 封装一个带复制功能的UILabel
我们发现UILabel不在为我们提供长按弹出复制等操作了, 我们来继承UILabel自己写一个带复制功能的UILabel. 代码: #import "CopyLabel.h" @i ...
- [WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序
近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列.希望能从中有所收获. 本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅.可能这些问题都很基础,可 ...
- CentOS6安装各种大数据软件 第五章:Kafka集群的配置
相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...
- linux查看网卡地址和硬盘序列号
linux查看网卡地址命令:ifconfig linux查看硬盘序列号命令:hdparm -i /dev/sda
- python 实现查找某个字符在字符串中出现次数,并以字典形式输出
把字符串'aenabsascd'中的字符出现的次数统计出来,并以字典形式输出 方法一: def count_str(str): dic={} for i in str: dic[i]=str.coun ...
- 每天一个linux命令(1):find命令之exec
ind是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释:-exec 参数后面跟的是command命令, ...
- PHP中使用RabiitMQ---各项参数的使用方法
RabbitMQ在PHP使用,我在这里对RabbitMQ的各项方法和参数进行了一些梳理,有不足的地方还望各位大神指点. 想要使用rabbitMQ消息队列,首先需要安装 php_amqp.dll 扩展 ...
- Hadoop(二)CentOS7.5搭建Hadoop2.7.6完全分布式集群
一 完全分布式集群(单点) Hadoop官方地址:http://hadoop.apache.org/ 1 准备3台客户机 1.1防火墙,静态IP,主机名 关闭防火墙,设置静态IP,主机名此处略,参考 ...
- HxUtils: 批量转换换行符,print2to3
在 windows 和 linux 系统,换行符有时需要转换,其代码文件 HxUntils.py 如下: ''' HxUtils.py 2018 by x01 ''' import os, sys d ...