算法笔记(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背包的滚动数组的更多相关文章

  1. POJ3624 0-1背包(dp+滚动数组)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 47440   Accepted: 20178 ...

  2. NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)

    一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...

  3. HDU 5119 Happy Matt Friends (背包DP + 滚动数组)

    题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...

  4. [算法]用java实现0-1背包和部分背包问题

    问题描述: 0-1背包问题,部分背包问题(课本P229)实验要求: (1)实现0-1背包的动态规划算法求解 (2)实现部分背包的贪心算法求解 0-1背包问题代码: public static void ...

  5. hdu2126 类01背包(三维数组的二维空间优化)

    题目描述: 对于给出的n个物品,每个物品有一个价格p[i],你有m元钱,求最多能买的物品个数,以及有多少种不同的方案 题目分析: 类似01背包的题目,一般的01背包问题我们遇到的是求n个物品,有m的容 ...

  6. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

  7. nyoj 203 三国志 dijkstra+01背包

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203 思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了 我奇怪的 ...

  8. 第K大01背包

    其实这个问题,真的挺好想的,但是我咋想了那么久呢~~ 很好理解,第K大01背包一定基于01背包,dp数组也很容易的想到由dp[V]  ---->   dp[V][K],来表示背包容量是V时候的第 ...

  9. HDU 1171Big Event in HDU(转01背包)

    题意: 给你一组数,分成差距最小的两份A,B(A>=B) 分析: 转01背包 注意: 01背包用一维数组 不要用二维 二维数组若是开太大,内存超限,开太小,RE #include "c ...

随机推荐

  1. page_address()函数分析--如何通过page取得虚拟地址

    由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的. 一. x86上关于page_address()函数的定义 在include/linux/ ...

  2. Oracle 使用RMAN进行备份

    备份理论和基本语法 备份概念 执行备份或还原草的数据库称为目标.在一些环境下,有许多数据库,因此有许多RMAN目标.应一次连接每个数据库.目标的每个备份都有一些属性: 打开或关闭 完整或部分 完整或增 ...

  3. iOS:时间相关(18-10-13更)

    先整理出时间相关的程序,以后有空再写成单例. 1.日历(NSCalendar) 2.时间格式() 3.时间戳 附录: 1.定时器 1.日历(NSCalendar) 1.想要获取 世纪.年.月.日.时. ...

  4. iOS笔记,开发经验总结【持续更新】

    1. 设置navigationBar 背景颜色有色差, 原因:如果单纯的设置背景颜色也是有高斯模糊处理的效果,对纯色高斯模糊处理过后相当于纯色的70%(猜测)透明化处理,但是反正就是有色差 解决方法一 ...

  5. VB

    on error resume next: 从该语句开始,遇到错误时程序不会中止,也不会出现错误提示,将继续运行.作用范围直至程序结束或语句所在函数等结束 Public Property :可读也可写 ...

  6. C++_类和对象

    类和对象 OOP第二课 1 类的构成 1.1 从结构到类 1.2 类的构成 2 成员函数的声明 2.1 普通成员函数形式 2.2 将成员函数以内联函数的形式进行说明 3 对象的定义和使用 3.1 对象 ...

  7. ImageMagick使用小结

    #查看是否安装imagemagick sudo apt list | grep imagemagick #安装imagemagick sudo apt-get install imagemagick ...

  8. js之冒泡排序与快速排序

    //冒泡排序 let arr = [1, 6, 3, 7, 5, 9, 2, 8]; function sort(arr) { //升序 console.time("冒泡排序耗时" ...

  9. 记遇到的一个php坑

    最近对项目的一个高访问量业务接口进行功能扩展,上线一段时间后,服务器cpu load突然飙升,并出现大量502.一开始找运维查看日志,并没有看是什么问题,后来发现别的部门项目之前也遇到类似的问题,原来 ...

  10. sqli-labs(less-11-16)

    POST登入 首先试试 uname=admin'# & passwd=1 登入成功 如果不知道用户名 ,注释符被过滤,可以从password入手 一般第一个登陆字段(一般是用户名)就用注释,第 ...