问题描述
有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。 输出方法数与100003的余数。
输入格式:
两个正整数N,K。
输出格式:
一个正整数,为不同方式数
分析:
假设每次最多走2阶:
台阶阶数 | 方法数 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
… | … |
假设每次最多走3阶:
台阶阶数 | 方法数 |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 7 |
… | … |
假设每次最多走4阶:
台阶阶数 | 方法数 |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 8 |
5 | 15 |
… | … |
假设台阶阶数为i,每次最多走的阶数为j, 可以发现规律:
走到第i阶台阶的方法数为前面第i-j(i-j>0)个方法数的和。
递推式为:
f(i) = f(i-1)+f(i-2)+…+f(i-k) ((i-k)>0)
编写程序:
#include <iostream>
using namespace std;
int main(){
int a[100] = {0};//存储第n阶的可能次数
a[0] = 1;
int n; //台阶数
int k; //每次走的最大步数
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
if(i-j>=0){
a[i] = a[i]+a[i-j];
a[i] = a[i]%100003;
}
}
}
cout<<a[n]<<endl;
return 0;
}