操作格仔 (數的劃分)

2021-07-29 12:41:18 字數 1274 閱讀 7276

題目描述 

description

將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同(不考慮順序)。

例如:n=7,k=3,下面三種劃分方案被認為是相同的。

1 1 5

1 5 1

5 1 1

問有多少種不同的分法。

輸入描述 

input description

輸入:n,k (6輸出描述 

output description

輸出:乙個整數,即不同的分法。

樣例輸入 

sample input

7 3樣例輸出 

sample output 4

資料範圍及提示 

data size & hint

我是參考討論區里的一位大神的解法做出來的

下面貼出這個解法

這一題實際上是組合數學裡面的經典問題,跟第二類stirling數有些相似。可以把乙個數值為n的數看成n個小球,

劃分的份數k看作是k個盒子,那麼本題的要求就是:

將n個小球放到k個盒子中,小球之間與盒子之間沒有區別,並且最後的結果不允許空盒

與第二類stirling數的遞推公式的推導過程相似:

將n個小球放到k個盒子中的情況總數 = 

1.至少有乙個盒子只有乙個小球的情況數

+2.沒有乙個盒子只有乙個小球的情況數

這樣進行劃分的原因是這種分類足夠特殊,1和2都有可以寫出來的表示式:

1. 因為盒子不加區分,那麼1的情況數與「將n-1個小球放到k-1個盒子中」的情況數一樣

2.沒有乙個盒子只有乙個小球,那麼把每個盒子中拿出來乙個小球,對應的是「把(n-k)個小球放到k個盒子中的情況數

至於1和2中的兩種等價關係為什麼成立,可以用集合a=集合b的方式去證明

最後將上面的敘述轉化為dp的表達形式:

f[n][k]代表將n個小球放到k個盒子中且沒有空盒的情況,那麼

f[n][k] = f[n-1][k-1] + f[n-k][k]

轉化成**即可

#includeint f[205][10];

int main()

} printf("%d\n", f[n][k]);

return 0;

}

A 數的劃分

a 數的劃分 將整數n 分成 k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 第一行有兩個整數 n,k 6sample input 7 3 sample output 解題思路...

wikioi 數的劃分

題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6 題解 f i,j ...

1039 數的劃分

題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6輸出描述 outpu...