错排&放苹果

错排公式 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;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值