代码随想录算法训练营第五十二天(完全背包篇)| 卡码网57. 爬楼梯

卡码网57. 爬楼梯

题目链接:题目页面

思路

爬楼梯其实也可以当成完全背包的问题。

1阶,2阶,.... m阶就是物品,层数就是背包的容量。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。问跳到楼顶有几种方法其实就是问装满容量为顶层的背包有几种方法。

1. dp数组定义

dp[j]: 到达j层有dp[j]种方法。

2. 递推公式

到达j层的方法可以由到达前面几层的方法得到,只要从离j层m步以内的台阶都能到达i层。

因此,递归公示为:dp[j] += dp[j-i],i属于1到m,且不能超过i。

3. 初始条件

dp[0] = 1, 从递推角度看,dp[0]是递归中一切数值的基础所在,如果dp[0]是0,其他数值都是0了。从实际意义看,爬上零层台阶就是选择不爬这一种方法。而对于非零下标,dp值是之前的值累加而来,所以刚开始为零。

4. 遍历顺序

这是背包里的排列问题,即:1、2 步 和 2、1 步都是上三个台阶,这是两种方法。

如果外层遍历物体,内层遍历背包容量,那么只会出现这两种的其中一种方法。如果外层遍历背包容量,内层遍历物体,那么对于每个容量,全部物体都会被遍历一次,就会得到这两种方法。

因此,应该外层遍历背包容量,内层遍历物体。

代码实现

n, m= map(int, input().split())  # 收集题目给出的n,m值
dp = [0]*(n + 1)
dp[0] = 1
for j in range(1, n+1):
    maxrange = min(m, j)
    for i in range(1, maxrange+1):
        dp[j] += dp[j-i]
print(dp[n])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值