多重集组合数问题

  • Post author:
  • Post category:其他




问题举例

有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 
但相同种类的无法区分.
从这些物品中取出m个, 有多少种取法? 求出数模M的余数.
例如: 有n=3种物品, 每种a={1,2,3}个, 取出m=3个, 
取法result=6(0+0+3, 0+1+2, 0+2+1, 1+0+2, 1+1+1, 1+2+0).



分析

考虑动态规划的办法,设d[i][j]为取第i种数长度为j,共有多少种取法,很容易想到的是d[i][j] = sum(dp[i – 1][j – k])(k : 0 ➡ min(j,m[i])),即对第i种数分别取长度为0到min(j,m[i])求和,为d[i][j],但是这种方法的复杂度略高,为O(n * m * m)



改进

贴上我的手推过程(✿◡‿◡)

在这里插入图片描述



结论

根据上述推导,可以总结出以下结论:

在这里插入图片描述



伪代码

for i : 1 ➡ n
	for j : 1 ➡ m
		if(j < a[i)//结论中的上式
		else//结论中的下式



版权声明:本文为weixin_44359964原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。