本题如何抽象为多重背包的问题呢?
此题楼梯爬的楼梯是1梯或者2梯,且爬到一个楼层可以多次爬一梯,或者多次2梯,请方法总数。
所以背包代表楼梯,1梯或者2梯代表2个物品和重量。
简略的5部曲:
dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。
此时还是背包求方法数的问题,所以递推公式还是dp[i] += dp[i - 重量]
注意的是遍历顺序,由于可以交换顺序,例如3梯可以为12或者21,所以是一个排列问题,先遍历背包,在遍历物品。
// 按照0-1背包的思路public int climbStairs(int n) {// dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。int[] dp = new int[n + 1];// 表示重量int[] weight = {1, 2};// 初始化,方便后边推导出公式dp[0] = 1;// 先遍历背包,就是总阶梯for (int j = 1; j <= n; j++) {// 再遍历物品,就是第i个阶梯for (int i = 0; i < weight.length; i++) {if (j >= weight[i]) {dp[j] += dp[j - weight[i]];}}}return dp[n];}
