今天我們再來學習乙個比較簡單的演算法,今天我們學習的是錯排問題,什麼是錯排問題呢?這樣說吧,假如現在書架上放有10本書,每本書都有固定的位置,現在讓你重新排列這些書,讓新排好的每一本書都不在原來的位置問你有多少種排列的情況。假如我們用num陣列來代表可能的情況,那麼我們容易知道num[1]=0,num[2]=1;
前幾個我們很容易就可以算出來,但是如果數字太大了,我們是不是就不能算出來了,現在我們要做的就是能夠找到乙個公式,來讓這個問題簡單化,那麼我們應該怎麼做呢?
解釋:n個不同的元素的錯排。
1:首先我們先錯排第1號元素,第一號元素可以排的位置有第二個位置到第n個位置,那麼第一步有(n-1)種情況;
2:第二步,「錯排」其餘 n - 1 個元素,按如下順序進行。視第一步的結果,若1號元素落在第 k 個位置,第二步就先把 k 號元素「錯排」好, k 號元素的不同排法將導致兩類不同的情況發生:
1、 k 號元素排在第1個位置,留下的 n - 2 個元素在與它們的編號集相等的位置集上「錯排」,有 f(n -2) 種方法;
2、 k 號元素不排第 1 個位置,這時可將第 1 個位置「看成」第 k 個位置(也就是說本來準備放到k位置為元素,可以放到1位置中),於是形成(包括 k 號元素在內的) n - 1 個元素的「錯排」,有 f(n - 1) 種方法。據加法原理,完成第二步共有 f(n - 2)+f(n - 1) 種方法。
根據乘法原理, n 個不同元素的錯排種數
f(n) = (n-1)[f(n-2)+f(n-1)] (n>2) 。
所以現在我們現在推出的遞迴公式就是num[n]=(n-1)*(num[n-1]+num[n-2]);
現在我們來看一道典型的例題:
hdu 2006'10 acm contest的頒獎晚會隆重開始了!這道題是杭電上的一道題,現在我們來給出ac**:為了活躍氣氛,組織者舉行了乙個別開生面、獎品豐厚的**活動,這個活動的具體要求是這樣的:
首先,所有參加晚會的人員都將一張寫有自己名字的字條放入**箱中;
然後,待所有字條加入完畢,每人從箱中取乙個字條;
最後,如果取得的字條上寫的就是自己的名字,那麼「恭喜你,中獎了!」
大家可以想象一下當時的氣氛之熱烈,畢竟中獎者的獎品是大家夢寐以求的twins簽名照呀!不過,正如所有試圖設計的喜劇往往以悲劇結尾,這次**活動最後竟然沒有乙個人中獎!
我的神、上帝以及老天爺呀,怎麼會這樣呢?
不過,先不要激動,現在問題來了,你能計算一下發生這種情況的概率嗎?
不會算?難道你也想以悲劇結尾?!
input
輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c 行資料,每行包含乙個整數n(1output
對於每個測試例項,請輸出發生這種情況的百分比,每個例項的輸出佔一行, 結果保留兩位小數(四捨五入),具體格式請參照sample output。
sample input
1 2sample output
50.00%author
lcy
#include#include#includeusing namespace std;
#define ll long long
int main()
return 0;
}
演算法 錯排問題
錯排問題 就是一種遞推式,不過它比較著名且常用,所以要熟記!方法一 n各有序的元素應有n!種不同的排列。如若乙個排列式的所有的元素都不在原來的位置上,則稱這個排列為錯排。任給乙個n,求出1,2,n的錯排個數dn共有多少個。遞迴關係式為 d n n 1 d n 1 d n 2 d 1 0,d 2 1 ...
演算法 錯排演算法
1.認識 什麼是錯排演算法?舉個簡單的例子,教室裡有十個座位 1 10 十位同學分別坐在乙個不同的位置上 1 10 現要求打亂所有同學的位置,打亂規則如下 所有的同學都不能出現在原來的位置上,問有多少種打亂的方法?引出錯排問題 有n個正整數1,2,3,n,將這n個正整數重新排列,使其中的每乙個數都不...
習題 錯排問題
十本不同的書放在書架上。現重新擺放,使每本書都不在原來放的位置。有幾種擺法?這個問題推廣一下,就是錯排問題,是組合數學中的問題之一。考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排。問題分析 要使每本書都不在原來放的位置,現在假設有n本書,...