這道題的本質是將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...