信封问题

有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的函数,一直卡数据,随手一试发现真的可以,就记录一下把。

发布了20 篇原创文章 · 获赞 17 · 访问量 998

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104084906