用 Python 编写程序来计算投掷 n 个骰子的方法数
programmingpythonserver side programming
假设我们有一个数字 n、面数和总值,我们必须找出投掷 n 个骰子的方法数,每个骰子都有面,才能得到总数。如果答案非常大,则用 10**9 + 7 对结果取模。
因此,如果输入为 n = 2 个面 = 6 个总数 = 8,则输出将为 5,因为有 5 种方法可以用 2 个 6 面骰子凑成 8:(2 和 6)、(6 和 2)、(3 和 5)、(5 和 3)、(4 和 4)。
为了解决这个问题,我们将遵循以下步骤 −
m := 10^9 + 7
dp := 大小为 (总数 + 1) 的列表,然后用 0 填充
对于范围从 1 到最小面数的面,在每个步骤中用总数 + 1 更新,然后执行
dp[face] := 1
对于范围为 0 到 n - 2 的 i,执行
对于范围总计为 0 的 j,减少 1,执行
dp[j] := f 在范围 1 到面 + 1 的所有 dp[j - f] 之和,当 j - f >= 1 时
返回 dp mod m 的最后一个元素
让我们看看下面的实现以便更好地理解 −
示例
class Solution: def solve(self, n, faces, total): m = 10 ** 9 + 7 dp = [0] * (total + 1) for face in range(1, min(faces, total) + 1): dp[face] = 1 for i in range(n - 1): for j in range(total, 0, -1): dp[j] = sum(dp[j - f] for f in range(1, faces + 1) if j - f >= 1) return dp[-1] % m ob = Solution() n = 2 faces = 6 total = 8 print(ob.solve(n, faces, total))
输入
2,6,8
输出
5