杭电2048错排问题

首先分析题目,题目中要求计算出没有一个人获奖的概率,即所有人全部错排的情况除于所有可能的情况

然后,在这里,重点分析错排情况共有多少种的算法

首先考虑,如果有n-1个人,并且这n-1个人已经完成了完全错排,则有f(n-1)种可能,那么,现在又来了一个人

那么后来的第n个人可以通过用自己的姓名牌去和那n-1个人中的任意一个人交换姓名牌,来实现n个人的完全错排。

在这种情况下,有(n-1)*f(n-1)种可能.

另外,如果开始的n-1个人不是完全错排,那么想使第n个人过来于其中一个交换姓名牌后实现错排的话就必须满足

两个条件:

1.   那n-1个人中只有一个选到了自己的姓名牌,也就是说n-2个人已经错排了。

2.  第n个人必须和那个选到自己姓名牌的人交换,但是那个选到自己姓名牌的人可以是n-1个人中的任意一个,这种

情况下有(n-1)*f(n-2)中可能,

其他情况下都不能完成n个人的错排

因此,递推关系为(n-1)*(f(n-2)+f(n-1));

#include<stdio.h>

int main()
{
int m;
int i,n;
double a,s[25];
s[1]=0; s[2]=1;
for(i=3;i<=20;i++)
s[i]=(i-1)*(s[i-1]+s[i-2]);
scanf("%d",&m);
while(m--)
{
a=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
a=a*i;
printf("%.2lf%%\n",s[n]/a*100);
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/alxbaj/article/details/80685299