错排问题--十二金钗

原创 2015年07月08日 20:27:07

#每日一面BAT#第6题:金钗赛诗

每日一面BAT
赛诗会后,十二金钗待奔前程。
分别宴上,12人各写了一首诗放入宝囊。
大家随机取一个,若取到自己的诗,则再取一个并放回自己的诗。
12人都拿到诗算一种分配。

问:共有多少种不同的分配?


问题来源:http://ask.julyedu.com/question/608?notification_id=31929&rf=false&item_id=2160,2164#!answer_2164

关于错排问题,百度百科有很清楚的解释(wiki也有。。。不过打不开/(ㄒoㄒ)/~~)

附上百度百科的链接:http://baike.baidu.com/view/668994.htm

既然百度百科都解释的很清楚了,我就不再多说废话了。说说我的做法。

以下黑体部分来自百度百科:

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.

D(1)=0 只有一个元素的时候,怎么放都是原来的位置,所以没有错排的可能

D(2)=1 两个元素的时候,相互调换一下位置就可以得到一种错排,也仅有这一种错排。

好了,现在我们有了递推公式,同时也有了初始值,因此我们就可以写一个函数(此处用C++语言)来计算出n个元素的错排分配种类数。

代码如下:

int wrongSort(int n)
{
    int f1 = 0; //D(1) = 0
    int f2 = 1;  //D(2) = 1
    int Dn = 0;
    if (n == 1)
    {
        Dn = f1;
    }else if(n == 2)
    {
        Dn = f2;
    }
    for (int i = 3; i <= n; i++)
    {
        Dn = (i-1)*(f1+f2); //D(n) = (n-1) [D(n-2) + D(n-1)]
        f1 = f2;
        f2 = Dn;
    }
    return Dn;
}

递推公式可以推导出结果的数学表达式,不过我看那个表达式挺长的,而且真的需要计算结果的时候,也不是那么容易就能得到结果。

所以我就直接采用递推来计算。算法复杂度O(n)。时间复杂度T(n)

版权声明:本文为博主原创文章,未经博主允许不得转载。

经典递推问题错排公式分析

问题: 十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法? 这个问题推广一下,就是错排问题,是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不...
  • u014492609
  • u014492609
  • 2014年10月06日 19:23
  • 2140

HDU--2049 部分错排问题

HDU题目实例 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的: 首先,给每位新娘打扮得几乎一模一样...
  • qq1169091731
  • qq1169091731
  • 2016年06月09日 14:34
  • 577

错排问题(组合数学)

f(n)=(n-1)*(f(n-2)+f(n-1));颜书先生《“装错信封问题”的数学模型与求解》一文(见《数学通报》 2000 年第 6 期 p.35 ),给出了该经典问题的一个模型和求解公式:编号...
  • xiaohuan1991
  • xiaohuan1991
  • 2011年05月12日 23:39
  • 3200

关于错排公式的推导与应用

错排公式的详细推导过程和简单应用
  • yangyuhao0408
  • yangyuhao0408
  • 2016年03月24日 13:52
  • 2020

组合数学--错排问题

错排问题,在IT面试笔试中都经常
  • sxh850297968
  • sxh850297968
  • 2014年10月11日 15:53
  • 1094

错排问题的总结

方法一:n各有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。任给一个n,求出1,2,……,n的错排个数Dn共有多少个。 递归关系式为:D(n)=(n-...
  • wptad
  • wptad
  • 2007年08月02日 21:06
  • 1134

Exe 4 篮球错排问题

(一) 问题描述: /** * 请编写程序求解篮球错排问题。 * 已知n个篮子一字排开(n为用户输入的任意正整数),从左到右分别标着号:1,2,... ...,n;每个球也有编号,分别也是1,2,.....
  • Deutschester
  • Deutschester
  • 2010年01月21日 02:14
  • 974

算法——错排问题

错排问题错排问题 就是一种递推式,不过它比较著名且常用,所以要熟记!方法一: n各有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。任给一个n,求出1,...
  • freezgw1985
  • freezgw1985
  • 2010年11月05日 13:41
  • 1592

C++篮球错排问题 ——实质是求满足错排条件下的全排列

问题描述: 请编写程序求解篮球错排问题。已知n个篮子一字排开(n为用户输入的任意正整数),从左到右分别标着号:1,2,... ...,n;每个球也有编号,分别也是1,2,... ...,n。现要将这n...
  • Deutschester
  • Deutschester
  • 2010年07月03日 21:04
  • 1336

排列组合之错排问题总结

目测最近要刷刷关于排列组合的题目。。。 所以现在将遇到的那些熟悉却已经忘记的问题都总结一下。。 第一发: 错排以及错排公式 其实错排问题对于程序算法而言,就是递归问题。因为错排的理解其实...
  • hu1020935219
  • hu1020935219
  • 2013年09月22日 14:48
  • 1780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:错排问题--十二金钗
举报原因:
原因补充:

(最多只允许输入30个字)