計數dp 劃分數 多重集組合數

2021-08-18 22:32:35 字數 690 閱讀 2391

劃分數:把n個無區別的物品劃分成不超過m組。

dp[i][j]=j的i劃分的總數。

dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:將j個物品分成i份,有兩種情況:每份劃分都大於等於1 dp[i][j-i]; 存在有乙份以上用0劃分dp[i-1][j]

int main()

cout<0;

}

多重集組合數:n種物品,第i種有a[i]個,從中選取m個,有多少種不同的選擇方法?

dp[i+1][j]:從[0, i]號物品中選取j個物品的方法。

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

這是我們很直觀想到的乙個遞推關係:dp[i][j]表示從i號物品中選0個, dp[i+1][j-1]從i號物品中至少選擇1個

實際上,由於是多重集而不是完全集合,我們已經選取了乙個i號物品,所以dp[i+1][j-1]表示的不是從i號物品中選擇至少乙個的數目,因為dp[i+1][j-1]包含了選取a[i]個i號物品(此時總共選擇了a[i]+1個物品了),這種情況是應該去掉。需要減去dp[i][j-a[i]-1],所以應該是###dp[i+1][j] = dp[i][j] + dp[i+1][j-1] - dp[i][j-1-a[i]];

void solve()

cout<}

多重集組合數

問題描述 有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 該題採用動態規劃。其中有乙個思想...

多重集組合數

題述 有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...