例题1爬楼梯
树老师爬楼梯,他可以每次走一级或者2级,输入楼梯的级数,求不同的走法数。
/**
爬楼梯
例如:楼梯一共有三级,他可以每次都走一级,或者第一次走一级,第二次走两级
也可以第一次走两级,第二次走一级,共3种方法。
n阶台阶的走法=先走一级后,n-1级台阶的走法+先走两级后,n-2级台阶的走法
f(n)=f(n-1)+f(n-2)
*/
#include<iostream>
using namespace std;
int stairs(int n)
{
if(n<0)
return 0;
if(n==0)
return 1;
return stairs(n-1)+stairs(n-2);
}
int main()
{
int N;
while(cin>>N)
cout<<stairs(N)<<endl;
return 0;
}
例题2 放苹果
把M个苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?5,1,1和1,5,1是同一种分法
输入:第一行是测试数据的数目t,以下每行均包含两个整数M和N,以空格分开。
输出:
对输入的每组数据M和N,用一行输出相应的K。
/**
设i个苹果放在k个盘子里放法总数是f(i,k),Ze
k>i时 f(i,k)=f(i,i)
k<=i时,总放法=有盘子为空的放法+没盘子为空的放法f(i,k)=f(i,k-1)+f(i-k,k)
*/
#include<iostream>
using namespace std;
int f(int m,int n)
{
if(n>m)
return f(m,m);
if(m==0)
return 1;
if(n==0)
return 0;
return f(m,n-1)+f(m-n,n);
}
int main()
{
int T,m,n;
cin>>T;
while(T--)
{
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}