素養賽Python複賽題——錯排問題

Danlis發表於2024-06-16

2023年北京賽區素養賽Python複賽題:
第6題,錯排問題
題目描述:
聖誕節快到了,公司為每個員工都準備了禮物,每個禮物都有一個精美的盒
子。如果所有的禮物都不小心裝錯了盒子,求所有禮物都裝錯盒子共有多少種不
同情況。
輸入描述:
輸入一個正整數n表示公司人數,保證n≤20.
輸出描述:
輸出一個整數,代表有多少種情況。
樣例1:
輸入:
2
輸出:
1

解析:
模擬:
n=1,有0種情況;
n=2,有1種情況;
n=3的時候,有兩種情況:
3 1 2
2 3 1
n=4的時候,有9種情況
原定順序是1 2 3 4
當1選擇2的位置
2 1 4 3
4 1 2 3
4 1 3 2
當1選擇3的位置
2 4 1 3
4 3 1 2
3 4 1 2
當1選擇4的位置
2 3 4 1
3 4 2 1
4 3 2 1
動態轉移方程f(n)表示n個禮物裝錯盒子,
第一反應感覺式子應該是如下:
第n個禮物裝錯盒子的選擇有n-1種,f(n)=(n-1)f(n)
但是f(4)!=(4-1)
f(3)
因為f(n)和f(n-1)之間還有一些差異在於,
因為第n個禮物一旦佔據了n-1箱子中的第m號,
那麼m號假定放置於n號箱子,現在開始錯排,
假設m號不能放於n號,情況即為f(n-1)。
但是m號可以放於n號,當m放在n號的時候,存在f(n-2)。


def f(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
    return (n - 1) * (f(n - 1) + f(n - 2))


n = int(input())
print(f(n))

相關文章