掷骰子问题
问题描述:给定n个骰子,每个骰子有m个面(从1到m编号),找到获得总和X的方法的数量。X是抛出所有骰子时每个面的值的总和。
我们首先想到的做法是找到n个骰子所有的组合并从中计算和为X的数量,但这种做法显然不是最优的。
思路:
用Sum(m,n,X)表示从n个m面的骰子中得到和为X的方法的总和。
则Sum(m,n,X)可以如下表示
Sum(m,n,X) = Sum(m,n-1,X-1) //有一个骰子为1,所以剩下的n-1个骰子总和应为n-1
+ Sum(m.n-1,X-2) //有一个骰子为1,所以剩下的n-1个骰子总和应为n-2
+ ...
+ Sum(m,n-1,X-m)//有一个骰子为m,所以剩下的n-1个骰子总和应为n-m
例如当有3个骰子,每个骰子有6个面,求总和为8时,有如下表示:
Sum(6, 3, 8) = Sum(6, 2, 7) + Sum(6, 2, 6) + Sum(6, 2, 5) +
Sum(6, 2, 4) + Sum(6, 2, 3) + Sum(6, 2, 2)
代码如下:
class Solution{
public long