描述
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
样例输入
样例输出
思路:看了网上大神的思路,屌屌的
设f(m,n) 为m个苹果,n个盘子的放法数目,则对n
当n>m,必定n-m永远空着,就把他们丢了,f(m,n) = f(m,m)
当n<=m时,
1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);
2、所有盘子都有苹果,从每个盘子中拿掉一个苹果不改变状态f(m,n) = f(m-n,n)
当没有苹果可放时,设为1种放法;
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; //注意要让m=0返回1,例子,f(2,2)=f(2,1)+f(0,2)=2,如果让f(0,2)其返回0,则错误 int fun(int m,int n) { if(m==0||n==1) return 1; if(n>m) return fun(m,m); else return fun(m,n-1)+fun(m-n,n); } int main() { int T,m,n; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); printf("%d\n",fun(m,n)); } }