1. 斐波那契数列
入门问题,模板问题,没什么好说的,熟读背诵。以及其中的滚动数组原理。
2. 爬楼梯问题
3. 机器人路径 (二维数组)
4. 机器人路径有障碍版 (二维数组)
5. 整数拆分
6. 分割等和子集
01背包问题
7. 最后一块石头
8. 目标和
9. 零钱兑换 (求组合)
完全背包问题求组合:
先遍历物品,然后遍历背包
背包问题的核心要素: 1.N件物品
2.每件物品有一个体积,然后有背包总体积限制
3.每个物品有价值
4.求在w体积下的最大价值。
int[] dp = new int[amount + 1] ; dp[i] ----> 构建第i元的时候一共有多少种解法。
先遍历物品,然后遍历背包。一维数组非常之抽象。
核心:假设只有一个元素,构建amout,一共有多少种解法。是一维数组的叠层状态。思路是先想第二层,然后想第一层。
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int i = 0; i < coins.length; i++) {
for (int j = coins[i]; j <= amount; j++) {
//核心是选第i个元素
//然后一维数组比二维数组更加抽象
//这个还是组合
//每一道题都异常经典,简直不能错过每一道题
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
10. 组合总和 (求排列)
完全背包问题求排列:
先遍历背包,然后遍历物品