遞推之合理放球

2021-08-18 19:15:23 字數 1787 閱讀 7659

描述

n個各不相同球放入m個相同的盒子裡,球全部放完後,要求最後沒有空盒!求不同的放法總數。

輸入一行兩個數n和m

n表示球數,m表示盒子數

(0<n≤20)(0≤m≤20)輸出不同且合理的放法總數

樣例輸入

3 2
樣例輸出
3
提示

遞推第二類stirling數

解題思路

注意觀察題目要求,盒子是一樣的,球是不一樣的,所以無論球放在哪個盒子都是一樣的,但是不一樣的是球要和那些球放在同乙個盒子裡還是它自己在乙個盒子裡。

本題遞推式比較簡單,首先可以想到一共分為一下四種情況

1.m=0;

當盒子數為0時,顯然放法為0。(沒有盒子怎麼放球嘛)

2.m=1;

當盒子數為1時,所有的球肯定要放在這乙個盒子裡面,所以方法為1。

3.m=n;

題目要求最後不能有空盒子,所以當球的個數和盒子的個數相等時,每乙個盒子放乙個球剛好把這些球平分,所以方法為1

4.m

當盒子的數小於球的個數時,說明一定有乙個或多個盒子中要放多個球。這時我們就要找遞推公式了。

當盒子數為m,球數為n-1時

,設此時的放法為

f(n-1)(m)

;好,那現在增加乙個球,球數變為n,那

增加的這個球

要放在**呢?仔細想一下,在沒有放置增加的這個球時是不是

每個盒子裡面都有球

?增加的這個球是不是

只有兩種放法

①這個球與其他球共用乙個盒子:

選擇其中乙個盒子(

有m種選擇

),把這個球放在這個盒子裡面,其它的球的放法剛才說了是

f(n-1)(m),那此時的放法是不是為m*f(n-1)(m)

。(我還是畫畫圖吧,好理解些,看下面)

②這個球獨佔乙個盒子:

先選擇乙個盒子,把這個盒子裡面的球騰空(移到其他盒子裡面),然後把增加的這個球放在這個空盒子裡面(這個盒子已經確定了放乙個球),此時其它的n-1個球是不是要放在剩下的m-1個盒子裡面?那此時的放法是不是為

當盒子數大於球數的時候,就算乙個盒子裡面只放乙個球都不夠放,最後總有盒子是空的,所以此時方法為0

參考程式

#includeusing namespace std;

int m,n,i,j;

long long s[25][25];//定義成long long型,要不然會爆

int main()

放蘋果(遞推)

題目描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。輸出 對輸入的每組資料m和n,用一行輸出相應的k。輸...

等概率放球

題目 有乙個機器按自然數序列的方式吐出球 1號球,2號球,3號球,你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候 n k 你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k n frac nk ...

放球遊戲B

校園裡在上活動課,red和blue兩位小朋友在玩一種遊戲,他倆在一排n個格仔裡,自左到右地輪流放小球,每個格仔只能放乙個小球。第乙個人只能放1個球,之後的人最多可以放前乙個人的兩倍數目的球,至少放1個球。最後面對沒有空格而不能放球的人為輸。現在red先走,問他有沒有必勝的策略?比如 n 4時,red...