用 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

相关文章