【题解】错排问题

题目描述

        某人写了n封信和n个信封,如果所有的信都装错了信封,共有多少种不同情况?

输入输出格式

输入格式

        一行,一个整数n(n≤10)。

输出格式

        一行,为所有的情况数。

输入输出样例

输入样例

4

输出样例

9

 

题解

        现在假设有$i$封信需要处理。

        当第$i$封信放在$[1,i)$中的第$j$个信封时,如果第$j$封信放到了第$i$个信封中,我们其实可以把当前情况下的情况数看做只有$(i-2)$封信的情况数。

        但如果第$j$封信放在了$[1,i)$中的第$k$个信封时,其实我们可以把第$i$个信封看做第$j$个信封,忽略实际已放了第$i$封信的第$j$个信封,这样我们就可以把当前的情况数看做只有$(i-1)$封信的情况数。

        这样就可以得到递推式:$a[i]=(i-1)\times(a[i-1]+a[i-2])$。

#include <iostream>

using namespace std;

int n;
int a[11] = {0,1,1,2};

int main()
{
    cin >> n;
    for(int i = 4; i <= n; i++)
    {
        a[i] = (i - 1) * (a[i - 1] + a[i - 2]); 
    }
    cout << a[n];
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10661679.html