动态规划学习笔记

本文主要参考了维基百科和这个博客

简介

动态规划(英语:Dynamic programming,简称DP)。动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

最经典的0-1背包问题可以用动态规划来解决。0-1背包问题的描述是这样:话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个。 但他身上能装宝石的就只有一个背包,背包的容量为C。这哥们把n个宝石排成一排并编上号: 0,1,2,…,n-1。第i个宝石对应的体积和价值分别为V[i]和W[i] 。排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西,那我要装下哪些宝石才能让我获得最大的利益呢?

假设一共有3个宝石,对应的容量V和价值W的列表为V=[5, 4, 3],W=[20, 10, 12],背包的容量C为10。那问题就变为:在背包容量为10的条件下,在这3个宝石中任选其中几个宝石装进背包,使得装入背包的宝石价值总和最大。

直观得看应该选择第0号宝石和第2号宝石装进背包,容量综合为5+3<10,价值总和为20+12=32。这种选择方法最优。人在作出这种选择的时候是如何思考的呢?应该是遍历了所有可能的装包情况。[]、[0]、[1]、[2]、[0,1]、[0,2]、[1,2]、[0,1,2],最终选出[0,2]这种方案,使得容量不超过10,而且总价值达到最大。但是当宝石比较多的时候,要遍历所有可能的方案几乎是不可能。计算机也可以模仿人类进行这种遍历,而且速度一定比人快很多倍。这种遍历所有方案的时间复杂度是C(n,0)+C(n,1)+C(n,2)+...+C(n,n)。这种时间复杂度太大了,计算机也接受不了,这种复杂度应该比多项式级别复杂度更高。总之这种遍历的方法是行不通的,必须找出一种时间复杂度更低的解决方法。那就是动态规划。动态规划的时间复杂度能达到C(C*n),而且还可以优化。

在3个宝石的例子基础上再增加一个宝石,加入第3号宝石V[3]=3,W[3]=20,现在的问题是用这4个宝石来装包,限制是包的容量为10,请给出一种方法使得包中所装的宝石价值总和最大?即d(4,10) 应该选[1,2,3]这种方案。然后再去掉第3号宝石,同时对于背包的容量限制减去3号宝石的容量,变为7。求用这3个宝石来填充容量为7的包,使得包中的宝石价值总和最大。即d(3,7)。最优方案应该是[1,2]。再去掉2号宝石,求用前两个宝石来填充背包,背包容量为4,求解d(2,4),则最优方案只能是[1]。看到了没,这是有规律的。问题d[4,10]、d(3,7)、d(2,4)的分别对应的解决方案[1,2,3]、[1,2]、[1],前者的解决方案包含有后者的解决方案。也就是说问题的最优解中包含有子问题的最优解。d(4,10)这个问题可以描述为d(3,7)加上另外一部分。可以这样看,现在已经得到d(3,7)的最优解,那怎么得到d(4,10)的最优解呢?

转载于:https://my.oschina.net/u/2264246/blog/653808

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值