其他分享
首页 > 其他分享> > P1595 信封问题——递推

P1595 信封问题——递推

作者:互联网

这道题其实是有通项公式的,不过需要预处理阶乘,否则会很费劲。

我们设F(N)是有N封信N个信封的时候的方案数。

那么则有 \(F(N) = (N - 1)\times (F(N - 1) + F(N - 2))\).

那为什么呢?

我们只道,第N个信一定不能放在第N个信封中,所以第N封信有N-1个信封可以放,所以结果肯定是 (N - 1) 乘上剩下的数的排列种数。

那么剩下的数的总数怎么算呢?我们假设第N个数放在了第k个信封中,那么我们需要看第k封信放在了哪里。(1)k放在n的位置,F(N - 2);(2)k不放在n位置,F(N - 1)。

于是代码也就很简单了。我一开始没有想到(2),所以错了,重要的是思维

#include<bits/stdc++.h>
#define LL long long

using namespace std;

LL f[25];
int n;

int main()
{
	cin >> n;
	f[0] = 1;
	f[1] = 0;
	for (register int i = 2; i <= n; i++)
	    f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
	cout << f[n] << endl;
	return 0;
}

标签:信封,P1595,int,LL,long,封信,放在,递推
来源: https://www.cnblogs.com/CYLSY/p/16071227.html