题目链接
本题是爬楼梯的进阶版,假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
不难发现,本题能够抽象为 完全背包问题
- dp[j] 表示 j 阶楼梯到达楼顶的爬法
- 递推公式 dp[j] += dp[j - i],i 为爬的台阶个数
- 初始化dp[0] = 0;
- 要统计爬到楼顶的方法,这是一种排列问题,因此需要外层循环遍历 楼梯阶数,内层循环遍历 每次爬的阶数
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin >> n >> m;
vector<int> dp(n + 1, 0);
dp[0] = 1;
for(int j = 0; j <= n; j++){
for(int i = 1; i <=m; i++){
if(j >= i){
dp[j] += dp[j - i];
}
}
}
cout << dp[n] << endl;
return 0;
}