假设我们有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
让我们看下面的实现以更好地理解-
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