动态规划问题是学习算法时一个尤其重要的内容,在讲解什么是动态规划以前,首先来说一下分而治之。算法
分而治之就是一个大问题能够被分解成许多个小问题,逐个解决最后合并便可。归并排序就是使用的分而治之,时间复杂度为O(n*logn),空间复杂度O(n)。可是咱们在使用归并排序时,每一个子问题都是只被计算一次,可是若是每一个子问题不相互独立,须要被重复计算好屡次,分而治之就再也不是明智的选择了,彻底能够把子问题的结果放在一个表中,须要就直接去查便可,这种存放子问题结果的方式就是所谓的动态规划。微信
动态规划能够解决各类问题,好比矩阵连乘(最小连乘次数),最长公共子序列,01背包……机器学习
今天咱们用动态规划解决三维01背包问题,在解决三维01背包以前,简单的讲一下01背包问题:有一个背包,最大载重W,有n个物品,每一个物品重量为w[i],价值为v[i],1 <= i <= n,i是整数。装入哪些物品才能使装入物品的总价值最大?下面给出01背包问题的动态规划解决思路,代码就不实现了,由于今天要解决的问题不是这个,可是今天要解决的问题是创建在这个问题的基础上。学习
阶段:在前N件物品中,选取若干件物品放入背包中;spa
状态:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能得到的最大价值;.net
决策:第N件物品放或者不放;blog
由此能够写出动态转移方程:排序
咱们用f[i, j]表示在前i件物品中选择若干件放在所剩空间为j的背包里所能得到的最大价值get
f[i, j] = max{f[i-1, j-w[i]]+v[i](j >= Wi), f[i-1, j]}it
这样,咱们能够自底向上地得出在前N件物品中取出若干件放进背包能得到的最大价值。
在这个问题中,仅仅只有一个限制条件,也就是最大载重,但是有些时候背包并不仅是载重受限,体积也会受限,当01背包问题有两个限制条件:载重和体积,这样01背包问题就变成了三维01背包问题。(这是我上网查的三维01背包问题的定义,不知道对不对,敬请谅解)一样的也能够写出动态转移方程:f[i, j, k] = max{f[i-1, j-w[i], k-V[i]]+v[i](j >= w[i], k >= V[i]), f[i-1, j, k]},V[i]表示第i个物品的体积,k表示剩余体积。
下面来看一下代码的实现和运行结果,为了方便你们理解,作了一些输出而且代码中有注释。
若是你们想知道具体的规划过程,解开上面代码的多行注释而后运行便可。
今天的文章有不懂的能够加群,群号:822163725,备注:小陈学Python,不备注但是会被拒绝的哦~!
最后欢迎你们扫码关注
本文分享自微信公众号 - Python机器学习算法说书人(Python-ML-Algorithm)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。