假设我们有n个,面数和一个总值,我们必须找到有可能将n个骰子与面一起掷出的总数的方法。如果答案是非常大的mod,则结果为10 ** 9 + 7。
因此,如果输入像n = 2个面= 6个总数= 8,那么输出将为5,因为有5种方法可以使8具有2个6面骰子:(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
对于范围总计为j的j,减1,
dp [j]:=当j-f> = 1时,范围1中的f到+1的所有dp [j-f]之和
返回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