poj1173 多重集組合數

2022-03-21 02:57:27 字數 1057 閱讀 1561

這道題的本質是將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)   證明如下:

對於第二問已知乙個串求它的序號我們可以講他寫成len向量,然後統計比他小的個數, 比如1101100 -> 2122可知當序號為偶數的時候他是1 奇數的時候是0, 對於1我們減少第乙個1右面1的個數, 對於0我們將0拓展到它的右面。 比如比2122小的可以分為4部分:

1???   23?? 22?? 211?  **如下:

#include #include 

#include

#include

using

namespace

std;

intn, k, m;

int d[50][50]; //

前i堆有n個物品的方案數

ints;

char str[100][50

];int getid(int s) //

獲取第s個字串的id

if(last!=0) tp[ntp++] =last;

int res = 0

;

int u =n;

for(int i=0; i1; i++)

else//0

u -=tp[i];

}return

res;

}int

main()

int res1 =d[k][n];

cin>>s;

for(int i=0; i)

cin>>str[i];

cout

for(int i=0; i)

return0;

}

多重集組合數

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