這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1, 2, ..., f。我們約定:擲骰子的得到總點數為各骰子面朝上的數字的總和。
如果需要擲出的總點數為 target,請你計算出有多少種不同的組合情況(所有的組合情況總共有 f^d 種),模 10^9 + 7 後返回。
示例 1:
輸入:d = 1, f = 6, target = 3
輸出:1
1.dfs
2.帶記憶的dfs
3.dp 轉移方程dp[i][j]=dp[i][j]+dp[i-1][k-j] ,dp[i][j]表示i個骰子求得j有多少種情況,
class solution(object):
def numrollstotarget(self, d, f, target):
""":type d: int
:type f: int
:type target: int
:rtype: int
"""if d==1:
return 1 if target<=f else 0
res=0
for i in range(1,f+1):
res+=self.numrollstotarget(d-1,f,target-i)
return res
class solution(object):
def numrollstotarget(self, d, f, target):
""":type d: int
:type f: int
:type target: int
:rtype: int
"""if f*dreturn 0
dp={}
def helper(d,t):
if (d,t) in dp:
return dp[(d,t)]
if d==1:
return 1 if 0tmp_sum=0
for i in range(1,f+1):
tmp_sum+=helper(d-1,t-i)
dp[(d,t)]=tmp_sum%(10**9+7)
return dp[(d,t)]
return helper(d,target)
class solution(object):
def __init__(self):
self.h={}
def numrollstotarget(self, d, f, target):
""":type d: int
:type f: int
:type target: int
:rtype: int
"""dp=[[0 for _ in range(1050)] for _ in range(35)]
dp[0][0]=1
for i in range(1,d+1):
for j in range(1,f+1):
for k in range(j,target+1):
dp[i][k]=(dp[i][k]+dp[i-1][k-j])%(10**9+7)
return dp[d][target]
1155 擲骰子的N種方法
暑假刷題水題居多,多數都沒有什麼記錄的價值,不過還是有題目是有必要寫下來供自己以後複習的。先上一題前幾天寫的題目 1155.擲骰子的n種方法 這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 t...
1155 擲骰子的n種方法
這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 target,請你計算出有多少種不同的組合情況 所有的組合情況總共有 f d 種 模 10 9 7 後返回。示例 1 輸入 d 1,f 6,ta...
leetcode 1155 擲骰子的N種方法
這裡有 d dd 個一樣的骰子,每個骰子上都有 f ff 個面,分別標號為 1,2 f 1,2,f 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 tar ge ttarget target 請你計算出有多少種不同的組合情況 所有的組合情況總共有 f df...