動態規劃之錯排問題以及相應的變形

2021-08-14 04:34:49 字數 2137 閱讀 6107

何謂錯排?錯排就是完全亂序,比如有n個元素各有自己的編號,然後有各自相應的位置,位置號等於編號,所有元素的編號與位置號都不相等的情況叫作錯排,那麼求所有的情況數,則是乙個動態規劃問題。

當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(n)表示所有情況。假設a的郵件a寄給了其他人,有n種情況,假設其中一種符合的情況,寄給了b,那麼得看b的郵件b,如果寄給了a,那麼這兩人錯排成功,那麼剩下n-2個人重新按此進行推理,即d(n-2);如果沒有寄給a,那麼暫時只知道a錯排成功,其它n-1個人得重新探索,即d(n-1)。所以d(n)=(n-1)(d(n-1)+d(n-2))。

**實現:

如上圖所示,這就是乙個錯排變形的求概率的題。對於n個人錯排的情況是d(n),而d(n)=(n-1)(d(n-1)+d(n-2)),而所有的**情況則是n!;所以對於n個人,出現無人獲獎的概率是:ans=d(n)/(n!)。

**實現:

#-*-coding:utf-8-*-

res=[0,0,1]

ans=2

tmp=['0.00%','0.00%','50.00%']

for i in range(3,21):

ans*=i#求所有**的情況

t=res[i]/float(ans)*100#求無人獲獎的概率

由上圖所示,n個新娘之中有m個是選錯的,則m個是錯排問題,而n個中選m個是組合問題,其中n個選擇m個情況是d=n!/((n-m)!m!),而m個錯排問題則d(m)=(m-1)(d(m-1)+d(m-2));所以出現n個新娘之中有m個是選錯的情況是ans=d*d(m)。

**實現:

#-*-coding:utf-8-*-

res=[0,0,1]

for i in range(3,21):

while true:

try:

n,m=map(int,raw_input().split())

ans=1

t=1#組合問題求n個中選m個新娘可能的情況。

for i in range(n-m+1,n+1):

ans*=i

for i in range(1,m+1):

t*=i

ans=ans/t

ans=ans*res[m]

print ans

except:

break

DAG上的動態規劃之硬幣問題

有n種硬幣,面值分別為 v1,v2,vn。每種都有無限多。給定非負整數s,問可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值。1 n 100,0 s 10000,1 vi s 思路 就是可以把終點看為0,輸入的數值為s,就轉化成了定終點的問題,那麼轉移方程其實就是ans max...

動態規劃 揹包問題降維以及衍生的硬幣問題

任何動態規劃核心就是劃分子問題,然後就是狀態轉移方程。中間求出來的子問題的解需要儲存起來。0 1 揹包問題解決的是物品只能夠選擇1次要不就不選,在揹包能夠裝得下的前提下面,能夠保證裝的價值最大 狀態轉移方程 f i j max 0 j wi j 用二維的空間來表示是比較簡單的 一維表示 f v 表示...

組合問題與動態規劃的聯絡之應用

一,問題描述 假設有個機械人坐在 x y 網格的最左上角,每次只能向下或者向左移動。最左上角的座標標記為 0,0 最右下角的座標為 x,y 請問 機械人從 0,0 走到 x,y 共有多少種走法?其實這個問題與 這篇文章 中提到的問題非常相似。二,問題分析 這個問題一共有三種方式來求解。第一種是使用公...