/*
form CSDN:
假设楼梯有M节,一个人一不最多跨过N节,问有多少中方法(请给出代码)
如M = 4, N = 2;
则有5种方法(1,1,1,1) ;(1,1,2);(1,2,1);(2,1,1);(2,2)
TheBadTouch(iamsleepy - 一睡不醒) 给出了一个很不错的解法:
#include < stdio.h>
#include < memory.h>
#define min(A,B) (A< B?A:B)
#define max(A,B) (A> B?A:B)
typedef unsigned __int64 int64;//自己根据编译器改,gcc就是unsigned long long
int main(){
int64 f[1025]; //最多一次阶梯这里1024啦(m< 1025)
memset(f,0,sizeof(f));
f[0]=1;
int i,j,m,n;
scanf("%d%d",&m,&n);
for(i=1;i< =m;i++)
for(j=1;j< =min(i,n);j++)
f[i]+=f[max(0,i-n+j-1)];
printf("%I64u/n",f[m]);
return 0;
}
我的解法和上面的解法算法思路是一样的,我感觉我的更容易被看懂 :-)
我将公式:f(m)=f(m-1)+f(m-2)+...+f(m-n) 做了一下简化:
f(m)=2f(m-1)-f(m-n-1)这样子递归就很方便了。
*/
#include <stdio.h>
#include <stdlib.h>
int way(int num,int step)
{
if (num<0) return 0;
if (num==0||num==1) return 1;
return 2*way(num-1,step)-way(num-(step+1),step);
}
int main(int argc,char *argv[])
{
int m,n;
if (argc!=3)
{
printf("usage : way [num] [step]/n");
exit(-1);
}
m=atoi(argv[1]);
n=atoi(argv[2]);
printf("there has %d way to up to the stair/n",way(m,n));
getchar();
}