问题:n级的台阶,每次可以跨一步,有m种跨法,求爬到第n阶台阶,共有多少种不同的爬法?
例: 一个猴子在一座30级台阶的山上爬山,猴子上山一步可跳1级,或3级,试求上山的30级台阶有多少种不同爬法
input:
30 2
1
3
output:
58425
input:
50 4
2
3
5
6
output:
106479771
#include<iostream> using namespace std; int main() { int i,j,k,n,m,stage[100]={0},step[100]; cin>>n>>m; for(i=0;i<m;i++) { cin>>step[i];//需从小到大输入跨步方法 stage[step[i]]=1;//eg: step[0]=3,stage[3]=1 意味着第0种跨法(每次跨3级)可以一步跨到第stage[step[0]]级台阶上 } step[m]=n; //以n作为第m+1种跨法,方便计算 /* 过程: 1.从stage[1]到stage[step[0]] stage都为0,因为最小的跨步方法是step[0]. 2.从stage[step[0]+1]到stage[step[1]] 有 stage[x]=stage[x]+stage[x-step[0]](step[0]<x<=step[1]) 3.从stage[step[1]+1]到stage[step[2]] 有 stage[x]=stage[x]+stage[x-step[0]]+stage[x-step[1]](step[1]<x<=step[2]) 4.以此类推 */ for(i=0;i<m;i++) for(j=step[i]+1;j<=step[i+1];j++) for(k=0;k<=i;k++) stage[j]+=stage[j-step[k]]; cout<<stage[n]<<endl; return 0; }
原文:http://blog.csdn.net/lc0817/article/details/44593287