传统的递归树,计算效率非常低,因为内容太多了。所以我们需要优化递归函数就是高水平的动态规划
这个题目的本质就是,想要解决凑11快钱的,问题,这样可以分为
3个递归,只要解决凑10块钱(差一块11),凑9,或者凑6(差五块钱)的问题就行了。
著名的背包问题
明确状态和选择。
会变化的就是状态,让状态变化的就是选择
看起来就是自变量和因为变量一样,会发生变化的就是自变量,影响变化的因为就是因变量。
明确dp数组的问题。
写状态转移方程。转移状态。
不把第i个用品装进dp数组的含义就是,我只把前I - 1个用品放进dp数组里,
背包代表里面行为有两种
1.是东西放进去,放进去之前还要考录一下,容量能不能放进去一个物品,毕竟还是有容量限制的
2.第二个状态,我这个东西能不能替换背包里别的东西?替换之后价值是变大了还是变小了。
动态规划经典题目
斐波那数列
每一项都是前两项的和
菲波那数列因为其特性,所以当n = 1,n = 2时候面对的是不断地递归。
线性规划也是这个特性
我们当前的值收到前面值得影响,而且很大程度的影响。
两种状态,选择或者不选,这两种状态都有道理。
斐波那契数列这样存在冗余可以被优化
写一个数组去优化这个东西,去存储这个东西
class Solution {
public int fib(int n) {
int[] moment = new int[n + 1];
return helper(moment,n);
}
public int helper(int[] moment,int n){
//每次传递进来一个n是下标
if(n == 0 || n == 1 ){
return n;
}
if(moment[n] != 0){
return moment[n];
}