1298 FORZA David Beckham

经典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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 获取lanucher 列表

引用:http://www.iteye.com/topic/696187 获取Launcher 启动列表 即 列出所有Launcher程序 通过PackageManager 来获取 [代码 步骤] 1. 定义内部类 LauncherItem 用于定义Application相关属性 比如:图标 名称 以及 ComponentName Java代码 public clas…

对int变量赋值的操作是原子的吗?

对于例子如下: int count 0; count; // 是原子操作吗? count; 是原子操作吗? 先说答案: 1、在单处理器下,如果将 count; 语句 翻译为单指令时,是原子操作。 不过现在处理器都会对语句进行优化。 2、在多处理器下&#xf…

信号量进程同步与互斥

2.哲学家吃面问题 semaphore fork[5]; for(int i0; i<5;i) fork[i]1; cobegin process philosopher_i( ){ while(ture){ think( ); P(fork[i]); P(fork[(i10%5])&#xff1b; eat&#xff08;&#xff09;&#xff1b; V(fork[i]); V(fork[(i10%5])&#xff1b; } } coend 5…

企业面试中关于MYSQL重点的28道面试题解答

问题1&#xff1a;char、varchar的区别是什么&#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的&#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么&#xff1f; DELETE命令从一个表中删除某一行&#xff0c;或多行&#xff0c;T…

普通的int main(){}没有写return 0;会怎么样?

结论可能大家看上面的图就知道了&#xff0c;没有加return 0;编译器会自动添加一个。那怎么证明呢&#xff1f; 可以查看相应的汇编代码&#xff0c;查看汇编代码推荐使用godbolt.org网站&#xff0c;相当方便。 如上图&#xff0c;输入C代码&#xff0c;在右半部分会显示编译…

HDU1029

这道题没啥好说的&#xff0c;直接飘过…… #include<iostream>#include<map>using namespace std;int main(void){ int ans,n,b; while(cin>>n) { map<int,int>a; for(int i0;i<n;i) { cin>>b;//用cin就超时了&#xff0c;超1000ms(换…

python 内置方法 BUILT-IN METHODS

setattr getattr hasattr 1. abs() returns absolute value of a number 返回绝对值 integer -20 print(Absolute value of -20 is:, abs(integer)) 2. all() returns true when all elements in iterable is true 都为true则为true 3. any() Checks if any Element of an Ite…

ubuntu下安装拼音输入法ibus

可以安装ibus输入法。ibus有取代scim到趋势。 使用方法&#xff1a; 启用:ctrolspace&#xff1b; 中英文切换&#xff1a;shift&#xff1b;

并发与并行的区别

学习多线程的时候会遇到一个名词&#xff1a;并发。这是属于操作系统中的词汇&#xff0c;需要了解并发和并行的区别&#xff0c;从网上搜集了几种说法帮助理解。 一&#xff1a; 并发是指一个处理器同时处理多个任务。 并行是指多个处理器或者是多核的处理器同时处理多个不同的…

TI CC2480 -- Z-Accel介绍

德州仪器(TI)宣布推出最新Z-Accel系列2.4GHz ZigBee认证网络处理器中的首款产品——CC2480。该器件为工程师提供了完整ZigBee功能&#xff0c;而无需全面了解繁琐的全功能ZigBee协议栈&#xff0c;从而尽可能减少了开发工作量&#xff0c;并简化了ZigBee功能与各种应用的集成工…

Oracle PL/SQL块 多表查询(emp员工表、dept部门表、salgrade工资等级表)

范例: 查询每个员工的编号&#xff0c;姓名&#xff0c;职位&#xff0c;工资&#xff0c;工资等级&#xff0c;部门名称●确定要使用的数据表|- emp表&#xff1a;员工的编号、姓名、职位、工资|- salgrade表&#xff1a;工资等级|- dept表&#xff1a;部门名称●确定已知的关…

多线程的互斥锁应用RAII机制

什么是RAII机制 RAII是Resource Acquisition Is Initialization&#xff08;翻译成 “资源获取即初始化”&#xff09;的简称&#xff0c;是C语言的一种管理资源、避免资源泄漏的惯用法&#xff0c;该方法依赖构造函数资和析构函数的执行机制。 RAII的做法是使用一个类对象&a…

asp.net 浏览服务器文件

http://www.csharpwin.com/dotnetspace/12018r482.shtml 前台文件file.aspx <% Page Language"C#"AutoEventWireup"true"CodeFile"file.aspx.cs"Inherits"file"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi…

使用jQuery queue(队列) 遇到的问题及解决方案

应用场景描述&#xff1a; 我现在要做文章列表的批量生成&#xff0c;使用AJAX将生成的进度情况展示给用户。首先要生成文章列表页&#xff0c;然后在生文章内容详细页。 假如有10页每页10条记录&#xff0c;就会10个文章列表页 总录数&#xff08;100条记录&#xff09; &…

pynput模块—键盘鼠标操作和监听

pynput.mouse&#xff1a;包含控制和监控鼠标或者触摸板的类。 pynput.keyboard&#xff1a;包含控制和监控键盘的类。 上面提到的子包都已被引入到pynput库中。要使用上面的子包&#xff0c;从pynput中引入即可。 下面有详细的示例文档。 控制鼠标 使用pynput.mouse控制鼠标&a…

linux的mysql小记

今天试着自己安装mysql数据库&#xff0c;前期准备工作&#xff1a;首先在http://www.mysql.com/downloads/mysql/里面下载两个文件&#xff0c;&#xff08;1&#xff09;MySQL-server-5.6.10-1.linux_glibc2.5.i386.rpm&#xff08;2&#xff09;MySQL-client-5.6.10-1.linux…

一定用得到的免费 C++ 资源,值得收藏!

提到C/C语言很多初学者都觉得&#xff0c;学到中间就进行不下去了&#xff0c;但是如果你最难啃的那几块硬骨头拿下&#xff0c;一切都会顺畅许多&#xff0c;而且C诞生很久了&#xff0c;因此有大量可以免费阅读编程文档。近日&#xff0c;在Quora上发现一份免费的C 资料列表&…

将试用版visual studio 2008升级为正式版 --更新

引用自 pkdoor 升级VS 2005 的方法如果我们不小心安装VS 2008的时候,没有事先更改CDKEY 我们也可以这么做来实现VS 2008的注册在“添加删除”里面选择删除"Microsoft Visual Studio Team System 2008 Team Suite--简体中文",然后在打开的窗口中选择最后一项“添加注册…

课外知识----浏览器存储技术

Cookie Cookie 是指存储在用户本地终端上的数据&#xff0c;同时它是与具体的 Web 页面或者站点相关的。Cookie 数据会自动在 Web 浏览器和 Web 服务器之间传输&#xff0c;也就是说 HTTP 请求发送时&#xff0c;会把保存在该请求域名下的所有 Cookie 值发送给 Web 服务器&…

SQL Server 事务、异常和游标

事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行&#xff0c;这个整体要么全部成功&#xff0c;要么全部失败&#xff0c;这就需要用到事务。 1、 事务的特点 事务有若干条T-SQL指令组成&#xff0c;并且所有的指令昨晚一个整体提交给数据库系统&#xff0c;执行…