本题如何抽象为多重背包的问题呢?
此题楼梯爬的楼梯是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];
}