1.明确定义的dp数组的含义

2.找到递推公式

在递推公式中我有以下总结

一、斐波那契数列,爬楼梯的递推公式为dp[i]=dp[i-1]+dp[i+2],种类问题

二、不同路径问题:规定走的方向,dp[i][j]=dp[i][j-1]+dp[j-1][i](左下)

三、整数拆分,dp[i]=j*dp[i-j]初始化dp[2]=1,第一层for循环从i=3开始j从1开始j<i

四、不同的二叉搜索树,dp[i]+=dp[j-1]*dp[i-j]左子树*右子树从j=1到i累加

五、0-1背包dp[j]=max(dp[j-weight[i]]+value[i],dp[j]);先物品,后背包且背包倒叙(保证了每次加一次物品),,,有类似的问题分割等和子集,最后一块石头相撞,

装满背包有多少种方法dp[j]+=dp[j-nums[i]];dp[0]=1;

升级版(两个维度)一和零(10,001,01)要求装满i个1与j个0的容器最多的子集数  这里定义dp[i][j]表示装i与j的最多个数0-1背包问题

dp[i][j]=max(dp[i][j],dp[i-w0[x]][j-w1[j]]+1);先物品,后背包,倒叙背包

六、完全背包问题,可以多次放入物品,这里使用先物品后背包,在背包中使用正序遍历for(int j=weight[i],j<backge;j++)

模拟重量为一的放入次序可以理解

这里的例题为零钱兑换(1,2,3)兑换为5,这里没有强调顺序,可以多次使用,就是一个完全背包问题,则dp[j]+=dp[j-nums[i]]顺序为先物品后背包(组合问题)

 

 

 

3.初始化

4.遍历顺序

5.打印检查

今天先总结到这里