经典01背包问题,没有什么陷阱,唯一要求就是要优化空间复杂度!下面是关于01背包的讲解:

01背包问题是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。

优化空间复杂度

以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。

先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值。那么,如果只用一个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。伪代码如下:

for i=1..N

for v=V..0  // 当然,这里不一定要循环到0,只需到c[i]即可!

f[v]=max{f[v],f[v-c[i]]+w[i]};

其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的f[v-c[i]]就相当于原来的f[i-1][v-c[i]]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[i][v]由f[i][v-c[i]]推知,与本题意不符,但它却是完全背包背包问题最简捷的解决方案。

其实,这里的动态规划就是一张数表,但它却有着与众不同的地方,假设用到的是二维数组,那么对数表某一行产生影响的就只有它的上一行,对dp[i][j]产生影响的就只有它同行前面的参数和上一行的参数,所以我们可以用一个一维数组进行记录,从后到前进行处理。其实这实质上就是动态规划的最优子结构性质!

转载于:https://www.cnblogs.com/gcb-1991/archive/2011/04/16/2018484.html

1298 FORZA David Beckham相关推荐

  1. 【01背包】贝克汉姆 beckham

    贝克汉姆 beckham.pas/c/cpp 1S/256MB [题目描述] 作为铁杆的贝克汉姆迷,silentsky很希望beckham能够重新恢复到巅峰状态,再次出现在世界杯赛场上!于是silen ...

  2. CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

    题目分析 来源:acwing 分析: 本题采用vector< string > 来读入原来模板.接下来的m行需要用到哈希表,进行模板和具体内容的映射. 遍历vector,如果找到{{,就对 ...

  3. CCF-201509-3-模板生成系统

    CCF 试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的 ...

  4. ODPS SQL for 数据操作语言DML

    基本操作: 查询: SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_co ...

  5. csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现

    试题编号:201509-3 试题名称:日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述: 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是 ...

  6. matlab oj,Matlab习题(1)

    <Matlab习题(1)>由会员分享,可在线阅读,更多相关<Matlab习题(1)(46页珍藏版)>请在人人文库网上搜索. 1.习题 l1 执行下列指令, 观 察其运算 结果, ...

  7. CCF201509试题

    来源:CCF计算机职业资格网站. 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数 ...

  8. CCF201509-3 模板生成系统(100分)

    试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录 ...

  9. 理想国pandas练习题3

    需求 存在test.json文件(文末),请完成以下需求 题1:读取json文件,并存储为csv文件 题1 # 题1:读取json文件,并存储为csv文件 import pandas as pddf ...

最新文章

  1. Python 标准库之 uuid
  2. 20165239其米仁增3
  3. php输出mysql错误日志_PHP_PHP中把错误日志保存在系统日志中(Windows系统),【将错误记录到系统日志中】 - phpStudy...
  4. python各种类型日期转换大全
  5. mysql支撑union_mysql 不支撑union select 的盲注方式
  6. 合并工具_分享一个SM to HISM合并工具
  7. 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?
  8. EFCore查询语句生成流程、让EFCore支持批量Update/Delete/MergeInto
  9. 编程让鼠标一直动_华硕、罗技、海盗船无线鼠标选哪个?
  10. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用
  11. JMeter如何和Charles进行接口测试
  12. Android emulator error: x86 emulation currently requires hardware acceleration的解决方案
  13. java编程获取屏幕分辨率_Java编程获取当前屏幕分辨率的方法示例
  14. Python数据写入csv格式文件
  15. m1136能支持哪些服务器,实测惠普M1136无线一体机,成就精英效率!
  16. python正则匹配单词和字符
  17. dtu虚拟服务器,DTU服务器云
  18. 携程、同程、QQ音乐、天猫...等14款APP被点名:涉嫌过度收集用户信息
  19. 网易邮箱登录界面制作方法
  20. 基于MSP430G2553点亮TM1637数码管

热门文章

  1. 三个月计算机培训班,三个月复盘:学完两个设计软件,并开始学画画
  2. dvwa详解_DVWA(六):XSSReflected 反射型XSS全等级详解
  3. java分布式锁工具类_java 通过redis实现分布式锁
  4. 调用SMS腾讯云短信验证码API的几个坑,及详细使用流程
  5. Android入门(11)| 全局广播与本地广播
  6. Python之分组级运算——【transform()方法、apply()方法】
  7. leetcode129. 求根到叶子节点数字之和
  8. C++:10---再议拷贝构造函数
  9. (十四)深入浅出TCPIP之初识UDP理解报文格式和交互流程
  10. Linux(17)-Make编译,Configure