有n个信封那个信,求所有信都装错的情况
这个题一看就像是一道高中数学题
实际上我们解决问题的关键在于找到递推关系
简单分析一下
首先第一封信一共有n-1种选择,之后第二份信就分为两种情况,第一种是他刚好放到第一封信的位置,那么剩余情况为f(n-2)
然后是他不在第一封信封的位置,就相当于把n-1个信不同的排在n-1个信封中即为f(n-1)
所以完整的递归式应为f(n)=(n-1)*(f{n-1)+f(n-2))
程序如下
#include<bits/stdc++.h>
using namespace std;
long long int f(int n)
{
if(n<=1)return 0;
if(n==2)return 1;
return (n-1)*(f(n-1)+f(n-2));
}
int main()
{
long long int n;
cin>>n;
long long int c;
c=f(n);
cout<<c;
}
实际上这到个题的数据增长非常快int型的函数无法返回正确答案,但我之前也没有见过longlongint的函数,一直卡数据,随手一试发现真的可以,就记录一下把。