1298 FORZA David Beckham
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相关推荐
- 【01背包】贝克汉姆 beckham
贝克汉姆 beckham.pas/c/cpp 1S/256MB [题目描述] 作为铁杆的贝克汉姆迷,silentsky很希望beckham能够重新恢复到巅峰状态,再次出现在世界杯赛场上!于是silen ...
- CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入
题目分析 来源:acwing 分析: 本题采用vector< string > 来读入原来模板.接下来的m行需要用到哈希表,进行模板和具体内容的映射. 遍历vector,如果找到{{,就对 ...
- CCF-201509-3-模板生成系统
CCF 试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的 ...
- ODPS SQL for 数据操作语言DML
基本操作: 查询: SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_co ...
- csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现
试题编号:201509-3 试题名称:日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述: 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是 ...
- matlab oj,Matlab习题(1)
<Matlab习题(1)>由会员分享,可在线阅读,更多相关<Matlab习题(1)(46页珍藏版)>请在人人文库网上搜索. 1.习题 l1 执行下列指令, 观 察其运算 结果, ...
- CCF201509试题
来源:CCF计算机职业资格网站. 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数 ...
- CCF201509-3 模板生成系统(100分)
试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录 ...
- 理想国pandas练习题3
需求 存在test.json文件(文末),请完成以下需求 题1:读取json文件,并存储为csv文件 题1 # 题1:读取json文件,并存储为csv文件 import pandas as pddf ...
最新文章
- Python 标准库之 uuid
- 20165239其米仁增3
- php输出mysql错误日志_PHP_PHP中把错误日志保存在系统日志中(Windows系统),【将错误记录到系统日志中】 - phpStudy...
- python各种类型日期转换大全
- mysql支撑union_mysql 不支撑union select 的盲注方式
- 合并工具_分享一个SM to HISM合并工具
- 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?
- EFCore查询语句生成流程、让EFCore支持批量Update/Delete/MergeInto
- 编程让鼠标一直动_华硕、罗技、海盗船无线鼠标选哪个?
- (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用
- JMeter如何和Charles进行接口测试
- Android emulator error: x86 emulation currently requires hardware acceleration的解决方案
- java编程获取屏幕分辨率_Java编程获取当前屏幕分辨率的方法示例
- Python数据写入csv格式文件
- m1136能支持哪些服务器,实测惠普M1136无线一体机,成就精英效率!
- python正则匹配单词和字符
- dtu虚拟服务器,DTU服务器云
- 携程、同程、QQ音乐、天猫...等14款APP被点名:涉嫌过度收集用户信息
- 网易邮箱登录界面制作方法
- 基于MSP430G2553点亮TM1637数码管
热门文章
- 三个月计算机培训班,三个月复盘:学完两个设计软件,并开始学画画
- dvwa详解_DVWA(六):XSSReflected 反射型XSS全等级详解
- java分布式锁工具类_java 通过redis实现分布式锁
- 调用SMS腾讯云短信验证码API的几个坑,及详细使用流程
- Android入门(11)| 全局广播与本地广播
- Python之分组级运算——【transform()方法、apply()方法】
- leetcode129. 求根到叶子节点数字之和
- C++:10---再议拷贝构造函数
- (十四)深入浅出TCPIP之初识UDP理解报文格式和交互流程
- Linux(17)-Make编译,Configure