Python中目标总数的骰子卷数

假设我们有d个骰子,每个骰子都有f个面,编号为1、2,...,f。我们必须找到模数为10 ^ 9 + 7的可能方式的数量(从fd种方式中选择),掷骰子,使正面朝上的数字总和等于目标。因此,如果输入像d = 2,f = 6,target = 7,那么输出将是6。因此,如果我们将每个骰子投掷6个面,则有6种方法获得总和6,即1 + 6。 2 + 5,3 + 3,4 + 3,5 + 2,6 + 1。

为了解决这个问题,我们将遵循以下步骤-

  • m:= 1e9 + 7

  • 制作dx(t + 1)阶的表dp,并用0填充

  • 对于i,范围为0至d – 1

    • 如果i = 0,则当j在1到f的范围内时dp [i,j]:= 1,否则为0

    • 除此以外

    • 如果j – l> 0,则dp [i,j]:= dp [i,j] + dp [i – 1,j-l]和dp [i,j]:= dp [i,j] mod米

    • 对于1到f范围内的l

    • 对于0到t范围内的j

    • 返回dp [d – 1,t] mod m

    示例(Python)

    让我们看下面的实现以更好地理解-

    class Solution(object):
       def numRollsToTarget(self, d, f, t):
          mod = 1000000000+7
          dp =[[0 for i in range(t+1)] for j in range(d)]
          for i in range(d):
             for j in range(t+1):
                if i == 0:
                   dp[i][j] = 1 if j>=1 and j<=f else 0
                else:
                   for l in range(1,f+1):
                      if j-l>0:
                         dp[i][j]+=dp[i-1][j-l]
                         dp[i][j]%=mod
          return dp [d-1][t] % mod
    ob = Solution()
    print(ob.numRollsToTarget(2,6,7))

    输入值

    2
    6
    7

    输出结果

    6