首页 > 其他分享 >动态规划递归公式理解

动态规划递归公式理解

时间:2022-10-23 15:58:59浏览次数:87  
标签:背包 下标 容量 递归 公式 放进 物品 动态 dp

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

递推公式:
dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。
那么可以有两个方向推出来dp[i][j]:

  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同。)
  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值
    所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

其中递推公式中dp[i - 1][j - weight[i]] + value[i]是比较疑惑的。

使用如下示例说明对递推公式的理解:
背包最大重量为6,问背包能背的物品最大价值是多少?

物品 重量 价值
物品0 1 15
物品1 3 20
物品2 4 30

以计算dp[2][6]为例,即计算从下标为[0-2]的物品里任意取,放进容量为6的背包,价值总和最大是多少。

  • 不放物品2
    想计算dp[2][6],计算下标为[0-2]的物品里任意取,放进容量为6的背包,价值总和最大是多少。定义一定要理解清楚。
    现在我们有个前提,不放物品2。那么从下标为[0-2]的物品里任意取,放进容量为6的背包从下标为[0-1]的物品里任意取,放进容量为6的背包 是等价的。所以dp[2][6] = dp[1][6],很好理解。
  • 放物品2
    想计算dp[2][6],计算下标为[0-2]的物品里任意取,放进容量为6的背包,价值总和最大是多少。定义一定要理解清楚。
    现在我们有个前提,放物品2。这个前提的意思就是:在当前容量为6的背包里,我一定要把物品2放进去。我们假设放进去一定能放进去吗?不一定,但是如果放不进去,那么就等价于第一种场景,相当于不放物品2。
    下面我们假设在容量为6的背包里,我们一定会把重量为4的物品2放进去。那么相当于容量为6的背包里一定要放重量为4的物品2,那么容量为6的背包里还能用的空间为:6-4=2,既然我们一定要放物品2,那么,dp[2][6]:从下标为[0-2]的物品里任意取,放进容量为6的背包,价值总和最大。就变成了,物品2的价值(已经假设一定要放进去) + 从下标为[0-1]的物品里任意取,放进容量为2的背包(因为放了物品2之后,容量为6的背包里容量只剩下2了),价值总和最大。
    所以dp[2][6] = 物品2的价值 + d[1][当前的容量 - 物品2的重量] = dp[2][6] =4 + d[1][6 - 4] = dp[2][6] =4 + d[1][2]。
    重点是要理解,第二种场景下(放物品2),我们假设了在当前容量为6的背包里,我一定要把物品2放进去。

转自:https://www.jianshu.com/p/9dc771f90523

标签:背包,下标,容量,递归,公式,放进,物品,动态,dp
From: https://www.cnblogs.com/unlasting/p/16818704.html

相关文章

  • 第19组 chap5 函数与递归 学习总结
    本周我们主要学习了c语言中的自定义函数与递归算法。我们了解到C语言中算法主要是依靠函数而实现的,而自定义函数与函数间的相互调用能帮助我们更好地实现目标。   ......
  • 动态DP 笔记
    矩乘大家都会!线段树大家都会!所以动态DP就这样诞生了!一些线性能做的DP可以写成广义矩阵乘法的形式,只要这个广义矩阵乘法具有结合律,那么就可以进行区间查询一类的操......
  • new创建动态内存
    int*q=newint;*q=3;cout<<*q<<endl;deleteq;int*q=newint(3);//两种方式newcout<<*q<<endl;deleteq;......
  • 动态规划(二)
    动态规划(二)动态规划问题的的一般思路:(数学归纳思想)判别问题是否具有最有子结构找到basecase,通过状态转移关系确认每一步的状态转换,定义dp数组的含义主要难点在于状态......
  • 动态代理
     动态代理就是通过代理类(Proxy)的代理,使接口和实现类之间不发生直接关系,而在运行期实现动态关联。 InvocationHandle类publicObjectinvoke(Objectobj,Methodm......
  • 动态规划笔记
    初识:labuladong动态规划遵循一套固定的流程:递归的暴力解法->带备忘录的递归解法->非递归的动态规划解法。动态规划算法做的就是穷举+剪枝递归算法的时间复杂度怎......
  • ABAP-选择屏幕字段动态显示和隐藏
    字段动态隐藏字段动态显示     给对应字段加上MODIFID即可SELECT-OPTIONS:S_ZSHNAM FOR  zmmt410-zbgy MODIF ID m1,             ......
  • #yyds干货盘点# 动态规划专题:斐波那契数列
    1.简述:描述大家都知道斐波那契数列,现在要求输入一个正整数n,请你输出斐波那契数列的第n项。斐波那契数列是一个满足  的数列数据范围:要求:空间复杂度 ,时间复杂度  ,本......
  • #yyds干货盘点# 动态规划专题:跳台阶
    1.简述:描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。数据范围:要求:时间复杂度: ,空间复杂度: 输......
  • #yyds干货盘点# 动态规划专题:跳台阶扩展问题
    1.简述:描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。数据范围:进阶:空间复杂度  ,时间复杂......