【HDOJ】2048 神、上帝以及老天爷
简单递推。第n个人可与n-1个错拿的人中任意一人交换字条即可,或者假设前n-1个人有一人拿对了,但其余n-2个人均拿错了,只需要交换n-1与n即满足条件。因此,f(n) = (n-1)*f(n-1) + (n-1)*f(n-2),即f(n)=(n-1)*( f(n-1)+f(n-2) )。
#include <stdio.h> #define MAXNUM 22 double tb[MAXNUM] = {0,0,1}; int main() { int case_n, n; double tmp; int i; scanf("%d", &case_n); for (i=3; i<MAXNUM; ++i) tb[i] = (i-1) * (tb[i-1] + tb[i-2]); while (case_n--) { scanf("%d", &n); tmp = 1.0; for (i=1; i<=n; ++i) tmp *= i; printf("%.2lf%%\n", (tb[n]/tmp)*100.0f); } return 0; }