错排公式 a[i] = (i-1) * (a[i-1] + a[i-2]);
放苹果问题
仅需考虑 0.有空盘子 1.无空盘
设f(m,n)为m个苹果放入n个盘子的方法的个数
对n进行讨论
如果 n>m ,肯定最少有n - m个盘子空着,所以f(m,n) == f(m,m);
如果 n <= m,则可以分类讨论
0.如果有空盘子 f(m,n) = f(m,n-1), 根据递归的思想,会继续出现2,3...个空盘子的结果
1.如果没有空盘 f(m,n) = f(m-n,n)
可理解为先将每一个盘子都放入一个苹果,则剩下m-n个苹果,剩下的问题就是将这m-n个苹果放入n个盘子中,将这m-n个苹果放入n个盘子中确实也会产生空盘的情况,但要注意,他并不是真的空盘,他们最开始已经放过一个苹果了,在这里的空只是代表这个盘子只有最开始放的一个苹果.
特别的 当只有一个苹果时 只有一种放法,没有苹果可放的时候定义为1种。
总的放法数目 分f(m,n) = f(m-n,n) + f(m,n-1)
附代码
#include <iostream>
using namespace std;
int f(int m,int n)
{
if(m == 0 || n == 1)
return 1;
if(n > m)
return f(m,m);
else
return f(m-n,n) + f(m,n-1);
}
int main()
{
int t;
cin >> t;
while(t--)
{
int m,n;
cin >> m >> n;
cout<<f(m,n)<<endl;
}
return 0;
}