按挑战程序设计竞赛介绍的顺序记录一遍学习DP的过程。

1. 01背包问题

问题如下:

有N个物品,每个物品(N[i])都有一定的体积(W[i]),和一定的价值(V[i])

现在给定一个背包,背包的容量为VBag

如何选择装进背包的物品,使背包中的物品价值总和最大?

动态规划的思想就是将一个大问题分解为易于解决的小问题,找到大问题对于小问题的递推关系,从而解决大问题。

对于01背包而言,多个物品如何选择很明显是一个不可解的问题

把题目中给的条件做一下变换,假设只有1个物品,就很好解了,如果背包能装下,就装。

再假设有两个物品,这时就要考虑一下背包的容量问题了。

1. 背包两个物品都能装下,最大价值就是两者之和

2. 如果只能装下其中之一,总的最大价值就是那个价值最大的

3. 如果只能装下一个物品,最大价值只能是装下的物品的价值

4. 如果两个都装不下,最大价值就是0

不难发现01背包问题的答案是由背包的大小以及物品的种类多少决定的

那么如何找到递推关系呢?

还是看上面,如果找到了从一个物品递推到第二个物品的关系,就可以以此类推了。

第二个物品只有装和不装两种情况

如果不装,那么就是只有一个物品的情况

如果装了,那么那么这个背包的空间就减少了,同时总的价值也变高了。

那既然装了第二个物品,第一个物品又会怎么样呢?

如果剩余的空间还足够第一个物品装下,那么第一个物品就可以装进背包

如果不够,那么就只能不装了。

比较这两种情况,选择总的价值最大的,这就是答案

现在设函数F(x,y)=最大价值,x为物品种类,y为背包大小

现在有一个物品

1. 如果W[i]>y,无论如何都没办法装下,F(x,y)=F(x-1,y)(这个物品就不考虑了)

2. 如果w[i]<=y,比较装或不装两种情况,选择较大的那种

F(x,y) = max (F(x-1,y),F(x-1,y-w[i])+v[i]),这就是01背包的递归方程

找到了递推方程后,按照递推方程填表,01背包答案就在最后一行最后一列

2. 最大字段和

给出一段序列,选出其中连续且非空的一段使得这段和最大

咸鱼的ACM之路:动态规划(DP)学习记录的更多相关文章

  1. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...

  2. DP学习记录Ⅱ

    DP学习记录Ⅰ 以下为 DP 的优化. 人脑优化DP P5664 Emiya 家今天的饭 正难则反.考虑计算不合法方案.一个方案不合法一定存在一个主食,使得该主食在多于一半的方法中出现. 枚举这个&q ...

  3. 咸鱼的ACM之路:DFS水题集

    DFS的核心就是从一种状态出发,转向任意的一个可行状态,直到达到结束条件为止.(个人理解) 下面全是洛谷题,毕竟能找到测试点数据的OJ我就找到这一个....在其他OJ上直接各种玄学问题... P159 ...

  4. 概率dp学习记录

    论文参考 汤可因<浅谈一类数学期望问题的解决方法> 反正是很神奇的东西吧..我脑子不好不是很能想得到. bzoj 1415 1415: [Noi2005]聪聪和可可 Time Limit: ...

  5. Python大神成长之路: 第一次学习记录

    一.Python发展史 二.Python2 or 3 博主选择了Python3. 从官网下载Python  www.python.org Windows安装python3.5.python2.7.安装 ...

  6. Re0:DP学习之路 01背包如何打印路径?

    伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva-624,目前wa不明所以,网 ...

  7. 记忆化搜索 dp学习~2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...

  8. 数塔~~dp学习_1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  9. nyist 606 ACM之路

    http://acm.nyist.net/JudgeOnline/problem.php?pid=606 ACM之路 时间限制:1000 ms | 内存限制:65535 KB 描述 转眼间,12级新生 ...

随机推荐

  1. 浅谈Go语言的Goroutine和协程

    0x00.前言 前面写了一篇初识Go语言和大家一起学习了Go语言的巨大潜力.语言简史.杀手锏特性等,感兴趣的读者可以回顾一下. 今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人 ...

  2. Idea自定义代码块【学习笔记】

    前言 idea有一个自定义代码块的功能,可以自定义代码块,方便以后工作中减少一些重复操作,这里就简单记录一下idea好用的模板吧,现在有一个关于日志的模板,用于写一个ServiceImpl方法的时候, ...

  3. oracle表空间位置迁移

    1.先登录sqlplus: C:\Documents and Settings\jbdu>sqlplus “/as sysdba”2.修改表空间为Offline: SQL> alter t ...

  4. 彻底搞懂flex弹性盒模型布局

    为什么要用flex 基于css3简单方便,更优雅的实现,浏览器兼容性好,传统的css实现一个div居中布局要写一堆代码,而现在几行代码就搞定了,没有理由不用flex. 兼容性: Base Browse ...

  5. pikachu-不安全的文件下载和上传

    一.文件下载漏洞 1.1 概述     很多网站都会提供文件下载的功能,即用户可以通过点击下载链接,下载到链接所对应的文件.但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获 ...

  6. dict的使用

    Python字典是可变类型数据,可以存储任意对象,如字符串,数字,元组,列表等. 字典的创键 字典有键key和值value组成,使用键值对链接:,字典也称为关联数组或哈希表. dict_person ...

  7. 简单了解css3样式表写法和优先级

    css3和css有什么区别?首先css3是css(层叠样式表)技术的升级版本,而css是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...

  8. MySQL中的执行计划explain

    一.用法及定义: explain为sql的执行计划.在sql前面加上explain关键字即可 如:explain select * from tbl_emp; 名词解释: id:[操作表的顺序] 1. ...

  9. deepin系统修改IP地址记录

    今天在配置软路由的时候需要设备有线网卡为静态地址,于是便按照如下方法进行修改: 1.备份网络配置文件: sudo cp /etc/network/interfaces /etc/netword/int ...

  10. PMP--1.4 项目描述

    一. 项目定义 项目:是为了创造 独特的产品.服务或成果而进行的临时性工作.  说明: (1)独特 即使某些项目中存在重复发元素,但重复不会改变项目本质上的独特性. (2)产品.服务或成果 1)一个独 ...