多重集組合數

2021-07-07 06:28:11 字數 944 閱讀 6254

問題描述:

有n種物品,第i種物品有ai個。從這些物品中取m個,有多少種取法,求出方案數 模上m的餘數。

sample input:

n = 3;

m=3;

a = ;

m = 10000;

sample output:

6 (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0)

該題採用動態規劃。

其中有乙個思想讓我感觸很深:

dp[i+1][j] := 前i種物品中取出j個物品的組合總數

那麼對於dp[i+1][j] 其中的每種取法都可以拆分為前i-1種物品取j-k件,第i種物品取k件、

那麼 dp[i+1][j] =∑m

in(j

,ai)

k=0d

p[i]

[j−k

] 做題的時候經常遇到這種公式,而怎麼把他轉換成動態方程,卻沒什麼思路,但是看了該題,終於有了點思路,那就是把上邊的求和公式轉變成另乙個dp陣列。即:∑

min(

j,ai

)k=0

dp[i

][j−

k]= ∑m

in(j

−1,a

i)k=

0dp[

i][j

−1−k

] + dp[i][j] - dp[i][j-1-ai]

注意,該公式分兩種情況,乙個是j-1

≥ ai時,另乙個即為小於時。

那麼由此得到

dp[i+1][j] = dp[i+1][j-1] + dp[i][j] - dp[i][j-1-ai]

而在寫**的時候,可能遇到得到的dp數為負數,因為其中有減法運算,所以有減法運算的時候,在末尾加上m 然後再模上m,這樣能確保得到的結果不會出現負數。

多重集組合數

題述 有n種物品,第i種物品有ai個。不同種類的物品可以互相區分但相同種類的無法區分。從這些物品中取出m個的話,有多少種取法?求出方案數模m的餘數。限制條件 1 n 1000 1 m 1000 1 ai 1000 2 m 10000 樣例 輸入3 5 1 2 3 10000輸出6 題記 dp i 1...

多重集組合數問題

參考 題目 有n種物品,第i種物品有a個.不同種類的物品可以互相區分,但相同種類的無法區分.從這些物品中取出m個,有多少種取法?求出數模m的餘數.例如 有n 3種物品,每種a 個,取出m 3個,取法result 6 0 0 3,0 1 2,0 2 1,1 0 2,1 1 1,1 2 0 dp i j...

poj1173 多重集組合數

這道題的本質是將n個物品分成k堆,每堆物品個數大於0小於等於m的方案數。我們定義d i j 為前i堆物品總數為j的方案數,那麼d i j 的求解方法如下 其可化為d i j d i j 1 d i 1 j 1 d i 1 j 1 m 初始條件為d 0 0 1 d i 0 0 i 0 證明如下 對於第...