错排问题,又称更列问题,是组合数学中的问题之一。这个问题有许多具体的版本,比如在写信时讲n封信装到n个不同的信封里,有多少种全部装错信封的情况?再比如n个人各写一张贺卡相互赠送,有多少种赠送方法?n个人拿错帽子问题。这些经典的题目都是典型的错排问题。
求解方法一般利用递归,从特殊到一般,得到问题的地推公式。
对于有n个元素的错排问题而言:
考虑第i个元素,将其放在第k个位置,有n-1种放法;
考虑第k个元素:
a.若k在位置i处,则问题归为n-2个元素的错排问题。
b.若k不在位置i处,等价于k不能在位置i处,则位置i的地位等价于原问题中的位置k,则问题归为n-1个元素的错排问题。
则递推式为:
D[i]=(i-1)*(D[i-1]+D[i-2])
利用递归求解:
int Derangement(int n) //返回n个元素的错排
{
int a[n+1]={0,0,1};//初始化a[0],a[1],a[2],其中a[k]表示k个元素的错排个数
for(int i=3;i<=n;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);
}