考新郎 (遞推)C語言

2021-09-09 08:54:04 字數 2008 閱讀 5738

time limit: 1000 ms memory limit: 32768 kib

problem description

在一場盛大的集體婚禮中,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做"考新郎",具體的操作是這樣的:

首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;

然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.

最後,揭開蓋頭,如果找錯了物件就要當眾跪搓衣板...

看來做新郎也不是容易的事情...

假設一共有n對新婚夫婦,其中有m個新郎找錯了新娘,求發生這種情況一共有多少種可能.

輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c行資料,每行包含兩個整數n和m(1 < m <= n <= 20)

對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。

2

2 23 2

1

3

一:

解題思路: 

1.先進行組合,然後在對m個人進行錯排 

2.從n個新郎中挑選出m個新郎

二:具體思路是  在n中挑m對的總數(利用排列組合知識得出)乘以m對挑選不同的總數

錯誤的挑選方法計算通過遞推公式可得   (遞推公式順著思路找規律可得)

f1=1

f2=1

f3=2

fn=(n-1)*f(n-1)*f(n-2)

三:解題思路:

一共有n對新婚夫婦,其中有m個新郎找錯了新娘。則有n-m個新郎位置正確

解題步驟分為兩步:

1、從n對夫婦中選中正確的n-m對進行組合,即:c(n,n-m)。

2、將m對夫婦進行錯排。兩步結果相乘即可。

四:分析:這個道題就是求n中有多少中m個數的錯排。

因此先找到n個新郎中m個錯一共有幾種,顯然是cmn=n!/(m!*(n-m)!)。即cmn=n!/m!/(n-m)!。

然後在求出m個數的錯排個數,遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])

詳細推導過程:

錯排的情況:

首先考慮,如果開始有n-1個新郎,並且這n-1個人都已經完成了錯排(有f(n-1)種可能),現在又來了乙個人,那麼後來的第n個人可以通過用自己的新娘去和那n-1個人中的任意乙個交換,來實現n個人都錯排。這種情況有(n-1)*f[n-1]種可能;

另外,如果開始的n-1個人不是都錯排,那麼要想使第n個人過來與其中乙個交換後實現錯排的話就必須滿足兩個條件:

1.那n-1個人中只有乙個人選到了自己的新娘,也就是說有n-2個人都已經錯排了。

2.第n個人必須和那個選到自己新娘的人去交換,但那個選到自己新娘的人可以是n-1個人中的任意乙個。這種情況有(n-1)*f[n-2]種可能。

其他情況都不能滿足n個人錯排。

因此遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])。

#include #include #include int f(int, int);

long long int a[25];

int main()

scanf("%d", &c);

while(c--)

return 0;

}int f(int m, int n)

//計算 n 的階乘

for(i = 1; i <= m; i++)

//計算 m 的階乘

if(n == m) c = 1;

else

//計算 n - m 的階乘

}sum = a / (b * c);

}return sum;

}

考新郎的C語言實現

題目內容 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...

HDU 2049 考新郎 遞推 錯排

problem description 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並...

不容易系列之 4 考新郎(遞推)

問題描述 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...