題目描述
某人寫了n封信和n個信封,如果所有的信都裝錯了信封。求所有信都裝錯信封共有多少種不同情況。
輸入格式
乙個信封數n(n<=20)
輸出格式
乙個整數,代表有多少種情況。
輸入輸出樣例
輸入 #1
輸出 #1 輸入 #2 輸出 #2#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
long
long f[30]
;int n;
intmain()
看上去這就是乙個遞推問題,那麼遞推式是如何推出來呢? 當 nn 個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用 d(n)d(n) 表示,那麼 d(n-1)d(n−1) 就表示 n-1n−1 個編號元素放在 n-1n−1 個編號位置,各不對應的方法數,其它類推.
第一步,把第 nn 個元素放在乙個位置,比如位置 kk ,一共有 n-1n−1 種方法;
第二步,放編號為 kk 的元素,這時有兩種情況:⑴把它放到位置 nn ,那麼,對於剩下的 n-1n−1 個元素,由於第 kk 個元素放到了位置 nn ,剩下 n-2n−2 個元素就有 d(n-2)d(n−2) 種方法;⑵第 kk 個元素不把它放到位置 nn ,這時,對於這 n-1n−1 個元素,有 d(n-1)d(n−1) 種方法;
綜上得到
d(n) = (n-1) *(d(n-2) + d(n-1))d(n)=(n−1)∗(d(n−2)+d(n−1))
特殊地,d(1) = 0, d(2) = 1d(1)=0,d(2)=1.
洛谷 P1595 信封問題
想不到刷普及 的題目還真有收穫 解 伯努利錯裝信封問題,公式上!f n n 1 f n 1 f n 2 n表示信封數 演算法分析 首先,f 0 1,f 1 0,f 2 1 當n 2時,設第一封信裝在第二個信封中 有n 1種方法 此時若第二封信裝在第乙個信封中,則剩下的即為n 2錯排問題 f n 2 ...
洛谷 P1595 信封問題 遞推 1 2
某人寫了n封信和n個信封,如果所有的信都裝錯了信封。求所有信都裝錯信封共有多少種不同情況。輸入格式 乙個信封數n n 20 輸出格式 乙個整數,代表有多少種情況。輸入樣例 1 2輸出樣例 1 1輸入樣例 2 3輸出樣例 2 2用f i 表示i個數的錯排 第一步 考慮放第n個元素,有n 1種 第二步 ...
錯裝信封問題
先看問題 hdu有個網名叫做8006的男性同學,結交無數,最近該同學玩起了浪漫,同時給n個每人寫了一封信,這都沒什麼,要命的是,他竟然把所有的信都裝錯了信封!注意了,是全部裝錯喲!輸入資料報含多個多個測試例項,每個測試例項占用一行,每行包含乙個正整數n 1對於每行輸入請輸出可能的錯誤方式的數量,每個...