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
廣告