题目描述:
给你m个东西,放在n个相同的盒子中(相同,即不计顺序),每个盒子可以放任意多,问有多少种放法。
这是组合数学母函数的典型应用。
解题报告:
整数划分问题。
dp[i][j] 表示 j 个东西放 i 个盒子中的方法数。则 i 个盒子的状态只有 2 种:有空的,和没有空的。
即dp[i][j] = 有空的 + 没有空的。
情况1:j < i
没有空的方法数为 0,有空的时,把一个盒子单独拿出来当做空的,剩下的任意放就是 dp[i - 1][j]
综上,dp[i][j] = dp[i - 1][j] + 0
情况2:j == i
没有空的时,有且仅有一种情况。
有空的时,方法同上,单独取出一个,方法数:dp[i - 1][j]
综上 dp[i][j] = dp[i - 1][j] + 1
情况3:j > i
没有空的时,可以从j 中拿出 i 个依次放到 i 个盒子中,剩下的随便放即可,方法数 dp[i][j - i]
有空的时,同上,dp[i - 1][j]
综上 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]