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