题目链接:
爬楼梯其实也可以当成完全背包的问题。
1阶,2阶,.... m阶就是物品,层数就是背包的容量。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。问跳到楼顶有几种方法其实就是问装满容量为顶层的背包有几种方法。
dp[j]: 到达j层有dp[j]种方法。
到达j层的方法可以由到达前面几层的方法得到,只要从离j层m步以内的台阶都能到达i层。
因此,递归公示为:dp[j] += dp[j-i],i属于1到m,且不能超过i。
dp[0] = 1, 从递推角度看,dp[0]是递归中一切数值的基础所在,如果dp[0]是0,其他数值都是0了。从实际意义看,爬上零层台阶就是选择不爬这一种方法。而对于非零下标,dp值是之前的值累加而来,所以刚开始为零。
这是背包里的排列问题,即: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])
因篇幅问题不能全部显示,请点此查看更多更全内容