一.背景

0-1背包与完全背包的唯一的区别在于0-1背包每个物品只能使用一次,但是完全背包可以重复使用。

二.0-1背包空间优化

假设物品编号1~n
i号物品重量w[i]
i号物品价值v[i]
以下分析基于dp[4](新)=dp[3]+v[2] dp[5]=dp[4](旧)+v[2]

0-1背包使用的倒叙遍历就是为了避免重复使用同一个物品。
1.先从反面说明,假设使用顺序遍历,dp[4](新)=dp[3]+v[2] ,dp[5]=dp[4](新)+v[2] 将dp[4]带入dp[5]可以得到dp[5]=dp[3]+2*v[2]即会使用到2个2号物品,不满足0-1背包的要求,即每个物品只使用一次。
2.使用倒叙为什么可以?
因为我们每次先更新的都是后面的元素,当在计算dp[5]时实际的dp[4]还没有更新,还是之前的状态,这种情况下,我们就最多只能使用到一次当前的2号元素,即dp[5]=dp[4](旧)+v[2] 。假设dp[4](旧)=dp[2]+v[1](使用1号元素更新的数据) 带入dp[5]可以得到dp[5]=dp[2]+v[1]+v[2],可以发现,dp[5]中并不存在重复的情况。其他位置元素类似。
你可能会想如果是dp[4](旧)=dp[3](旧旧)+v[2](旧旧)呢,这不就又是使用了两次v[2]了吗,但是实际上我们每次都是取的一个元素然后判断它放的位置,所以v[2]的使用必然在一次循环中,而我们使用的倒序,是先从后面开始的所以在dp[5]使用v[2]之前,dp[4](旧)是不可能使用到v[2]的,实际使用的v[2]旧旧(即v[2]旧的上一层)。

三.完全背包空间优化

同样假设物品编号1~n
i号物品重量w[i]
i号物品价值v[i]
以下分析基于dp[4]最优=dp[3]+v[2] dp[5]=dp[4](新)+v[2]

为什么使用顺序遍历优化?
顺序遍历的特点是,我们可以对同一物品使用多次。比如0-1背包的例子:dp[4](新)=dp[3]+v[2] ,dp[5]=dp[4](新)+v[2] 。值得注意的一点,顺序遍历不是一定要使用多次,而是允许我们使用多次(实际可以为0~无数次)。另外使用多次是建立在其他元素之上如dp[5]是建立在dp[4]之上,因为dp[4]使用了一次物品2才有了dp[5]共使用了2次物品2。如果不是建立在其他元素之上,而是直接加上多少次=》eg:k*v[2] 这属于暴力的完全背包解法。

四.模板

0-1背包:
for(int i=1;i<=n;i++{
for(int j=m;j>=w[i];j–){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
完全背包:
for(int i=1;i<=n;i++){
for(int j=w[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}

背包问题,为什么使用倒叙、顺序分别优化01背包和完全背包.相关推荐

  1. python3 列表倒叙_python的列表、元组、字典、集合

    本文首发于我的博客 徐小晋的博客 | Xu Xiao Jin​jiayouxujin.github.io python的列表.元组.字典.集合​jiayouxujin.github.io 前言 本文对 ...

  2. 背包问题(01背包,完全背包,多重背包(朴素算法二进制优化))

    写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题   题目   有m件物品和一个容 ...

  3. python 3教程:基于python3实现倒叙字符串

    这篇文章主要介绍了基于python3实现倒叙字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 google测试工程师的一道题: 设计一个函数,使 ...

  4. java comparable排序_java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 packa ...

  5. 根据数组中对象的属性值排序倒叙

    数组中对象的属性值排序倒叙demo function compare(e) {return function (a, b) {var value1 = a[e];var value2 = b[e];r ...

  6. C语言 输入中文语句并按倒叙将它输出

    2019独角兽企业重金招聘Python工程师标准>>> 在Dev C++里按ctrl+空格键就可以输入中文汉字. #include<stdio.h> #include&l ...

  7. 把字符串里的整数倒叙一个一个打印出来

    把字符串里的整数倒叙一个一个打印出来 int count = 0; void myRevert(int n, int a[]) {if (n < 10){a[count++] = n;}else ...

  8. python 倒叙 数组_打基础一定要吃透这12类 Python 内置函数

    内置函数就是python给你提供的, 拿来直接用的函数,比如print.,input等.截止到python版本3.6.2 python一共提供了68个内置函数,我将它们分成 12 类,方便你学习. s ...

  9. Python 技术篇-index()字符串倒叙匹配获取索引,字符串切片反向输出,逆向输出字符串

    这个是剪切板复制文件路径的字符串,我就是想获取拓展名,来判断文件类型. "PyQt5.QtCore.QUrl('file:///C:/Users/Public/Pictures/Sample ...

最新文章

  1. android设置控件的坐标,Android中使PopupWindow显示在指定控件的上下左右!
  2. Android--多点触控事件捕捉
  3. python中argv的用法
  4. 如何卸载linux中的docker,linux centos7 安装、卸载docker
  5. safari浏览器_吹爆苹果自带浏览器Safari,没有比它更贴心的浏览器了!!
  6. 【报告分享】2020中国教育行业生存实录.pdf(附下载链接)
  7. 使用 Jupyter 近 2 年,发现了这 3 个实用技巧
  8. Elasticsearch+Mongo亿级别数据导入及查询实践
  9. python模块 | 多种操作系统接口—os模块
  10. smb协议讲解_SMB/CIFS协议解析一概述
  11. python实现·数据结构与算法之单向链表
  12. 阿里云服务器使用命令行上发送邮件
  13. 对新手严重不友好的强者——Nginx那些俯拾皆是的坑
  14. 测试眉形的有哪个软件_适合眉毛的软件
  15. .Net 简单使用 Hangfire
  16. Kotlin 找素数/质数
  17. 天玑9200搭载Arm最新旗舰GPU,性能爆表!支持移动端硬件光追
  18. 浮云绘图编辑器之直线、方块、圆等基础图元操作和接口源码
  19. 个人学习笔记——Python篇(基础)
  20. php模板新闻,微信小程序模板新闻实现(PHP+ 小程序)

热门文章

  1. WP8.1之小小记事本编程
  2. 计算机多媒体对语文教学的提高,【原创论文】多媒体技术在中学语文教学中的应用...
  3. 6-2 读文章(*) (10分)
  4. ubuntu14.04 刚安装完成后汉语拼音输入法出错问题的解决办法
  5. SOI round1 题解
  6. 房地产合同档案分类及编号规则
  7. 求助,我电脑是不是中毒了。
  8. STC89C52RC - 1 - 简述以及最小操作系统
  9. arm电子相册项目——项目要求篇(描述功能)
  10. Pixhawk串口名称与硬件接口对应关系