Python 中求目标和的骰子投掷次数
假设我们有 d 个骰子,每个骰子有 f 个面,编号为 1、2、…、f。我们需要找到投掷骰子使得向上数字之和等于目标值的可能方式的数量(在 fd 种总方式中),结果模 10^9 + 7。例如,如果输入 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
- 创建一个大小为 d x (t + 1) 的表格 dp,并用 0 填充。
- 对于 i 从 0 到 d – 1
- 对于 j 从 0 到 t
- 如果 i = 0,则当 j 在 1 到 f 的范围内时,dp[i, j] := 1,否则为 0。
- 否则
- 对于 l 从 1 到 f
- 如果 j – l > 0,则 dp[i, j] := dp[i, j] + dp[i – 1, j - l],并且 dp[i,j] := dp[i, j] mod m
- 对于 l 从 1 到 f
- 对于 j 从 0 到 t
- 返回 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
广告