回溯法 伯努利裝錯信封問題

2021-10-10 13:36:47 字數 698 閱讀 3705

某人給6個朋友每人寫了一封信,同時寫了這6個朋友位址的信封,有多少種投放信箋的方法,使每封信與信封上的收信人都不相符?

#include

intmain()

}else t=0;

//第i封信在第i個信封,不滿足條件

if(t&&i==n)

//已經到最後一封信了,前面的信也都可以放到滿足條件的位上了

if(t&&i

//前面的信放到滿足條件的位上了,且還沒到最後一封信

while

(a[i]

==n&&i>0)

//第i封信已經試到最後乙個信封了,且i>0

i--;//調整或回溯,調整前面的信

if(i>

0) a[i]++;

//把第i封信位置前移

else

break

;//前面沒有信可以調位置了,break

}printf

("\n%d個整數全錯位排列共以上%ld個。\n"

,n,s)

;return0;

}

ps:在學習回溯法時,花了好久好久才明白程式的寫法,清楚每一步的意思。所以,在這裡對大部分**進行了說明,希望可以讓還在回溯法中迷路的小夥伴們能弄懂一些。可能有些地方的描述還不是很完善,唔,可以先去了解了解 皇后問題 的解法,再來理解這個可能會更清楚一些,它們是類似的。

關於伯努利數

主要是寫這個部落格用來記錄自然數冪和與伯努利數的關係 伯努利數定義如下 b 0 1 sum nb ic i 0 於是我們有了它的遞推式 b n frac sum b ic i 有乙個經常用的東西,用來求自然數冪和 s m n sum i m s m n frac sum c b i n 1 上面的式...

伯努利數學習筆記

定義伯努利數列 b n 滿足 b 0 1,sum nb i 0 n 0 可以發現定義式裡面包含了 b n 這一項,於是把 b n 提出來 b n sum b i n 1 b n sum b i b n frac sum b i 直接用定義式求是 o n 2 的複雜度 把定義式的迴圈上界減一,得 su...

學習筆記 伯努利數

b n n 0 frac 1 sum binom i b i 同時有 hat x sum b i frac frac x 所以可以使用多項式求逆求出伯努利數。設自然數冪和函式 s k n sum i k 那麼有 s k n frac 1 sum k binomi b i n 設 hat n x su...