题目在基础dp题。

本题如何抽象为多重背包的问题呢?

此题楼梯爬的楼梯是1梯或者2梯,且爬到一个楼层可以多次爬一梯,或者多次2梯,请方法总数。
所以背包代表楼梯,1梯或者2梯代表2个物品和重量。
简略的5部曲:
dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法
此时还是背包求方法数的问题,所以递推公式还是dp[i] += dp[i - 重量]
注意的是遍历顺序,由于可以交换顺序,例如3梯可以为12或者21,所以是一个排列问题,先遍历背包,在遍历物品。

  1. // 按照0-1背包的思路
  2. public int climbStairs(int n) {
  3. // dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。
  4. int[] dp = new int[n + 1];
  5. // 表示重量
  6. int[] weight = {1, 2};
  7. // 初始化,方便后边推导出公式
  8. dp[0] = 1;
  9. // 先遍历背包,就是总阶梯
  10. for (int j = 1; j <= n; j++) {
  11. // 再遍历物品,就是第i个阶梯
  12. for (int i = 0; i < weight.length; i++) {
  13. if (j >= weight[i]) {
  14. dp[j] += dp[j - weight[i]];
  15. }
  16. }
  17. }
  18. return dp[n];
  19. }