算法笔记(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 ...
随机推荐
- WAPM环境配置(PHP入门2)
WAMP介绍 W:Window:开源免费 A:Apache:开源免费 M:MySQL:开源免费 P:PHP:开源免费 Apache下载 Apache下载地址:https://www.apachehau ...
- 基于.net core 微服务的另类实现
基于.net core 的微服务,网上很多介绍都是千篇一律基于类似webapi,通过http请求形式进行访问,但这并不符合大家使用习惯.如何像形如[ GetService<IOrderServi ...
- Maven 逆向工程
pom.xml <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupI ...
- 不可变字符串String与可变字符串StringBuilder、StringBuffer使用详解
String字符串 char类型只能表示一个字符,而String可以表示字符串,也就是一个字符序列.但String不是基本类型,而是一个定义好的类,是一个引用类型.在Java中,可以将字符串直接量赋给 ...
- Delphi东京版FireDAC连接MSSQL2000提示对象名 'SYS.DATABASES' 无效
在Delphi 10.2.1 东京 版中,FireDAC默认不兼容MSSQL2000,会提示“[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driv ...
- Spark RDD理解
目录 ----RDD简介 ----RDD操作类别 ----RDD分区 ----宽依赖和窄依赖作用 ----RDD分区划分器 ----RDD到调度 返回顶部 RDD简介 RDD是弹性分布式数据集(Res ...
- HTML学习笔记--元素
1. 开始标签称为起始标签,结束标签称为闭合标签 openging tag closing tag HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 ...
- Python学习:15.Python面向对象(二、继承的各种情况)
一.什么是继承 继承是一种创建类的方法,在python中,一个类可以继承来自一个或多个父.原始类称为基类或超类. #创建父类 class Parent1: pass class Parent2: pa ...
- ACM1009:FatMouse' Trade
Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...
- scala 时间格式转换(String、Long、Date)
1)scala 时间格式转换(String.Long.Date) 1.时间字符类型转Date类型 [java] view plain copy import java.text.SimpleDateF ...