【剑指offer】面试题43:n个骰子的点数
生活随笔
收集整理的這篇文章主要介紹了
【剑指offer】面试题43:n个骰子的点数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第一種思路是,每一個骰子的點數(shù)從最小到最大,如果為1-6,那么全部的骰子從最小1開始,我們?nèi)绻环N從左向右的排列,右邊的最低,索引從最低開始,推斷和的情況。
def setTo1(dices, start, end):for i in range(start, end):dices[i] = 1def probability(n, s, dmax = 6, dmin = 1):if s < n * dmin or s > n * dmax : return 0dices = [1] * ni = n - 1total = 0while i >= 0:curSum = sum(dices)if curSum == s: print dicestotal += 1# find first one that can +1 for j in range(i, -1, -1):if dices[j] < dmax and s - sum(dices[0:j+1]) >= n - j*dmin:dices[j] += 1setTo1(dices, j + 1, n)i = n - 1breakelse:i -= 1elif curSum < s:if dices[i] < dmax:dices[i] += 1i = n - 1else:i -= 1print "total = {0}, prob = {1}%".format(total, total*100/dmax**n) return total若當(dāng)前和小于s,則檢驗當(dāng)前索引處的骰子是否能添加�1,若能,則添加�,否則查看其前面的是否能添加�。若相等,那么我們統(tǒng)計信息后,要變化當(dāng)前的情形,以便處理下一種情況,由于 索引是從低位開始到當(dāng)前位的,所以我們從當(dāng)前索引開始,向前找能繼續(xù)添加�的骰子,這里的推斷標(biāo)準(zhǔn)是當(dāng)前骰子的點數(shù)小于最小值,并且要保證其后的骰子的最小值為1,比方 1,4,1, s = 6, 當(dāng)前索引指向4, 這里的4盡管小于最大點數(shù)6, 但若其再加一,第三個骰子就的為0,這不符合要求。若找到能夠加一的骰子,那就將該骰子點數(shù)加1, 將其后的骰子都置為1,索引回到最后,開始又一次加起。如:1,1,6,s = 8, 索引指向6, 改動后為1,2,1,索引指向最后的1,。若沒有找到能夠再添加�的骰子,那么就結(jié)束。如6,1,1,s = 8。
事實上若給定的n不大的話,我們能夠設(shè)一個n位整數(shù),從n個1開始,逐次加一,來推斷各個位的和是否滿足要求,直到達到最大值,n個6。
這個問題事實上動態(tài)規(guī)劃的特點非常明顯。
'''@ state function: dp[i, j]: the total cases of sum = j, composed by i dices@ state tranfor function: dp[i, j] = sum(dp[i - 1, j - k]) for k in [dmin, dmax] @ dp[i, j] = 0, j > i * dmax or j < i * dmin@ init condition: dp[1, k] = 1, for k in [dmin, dmax], dp[1, k] = 0, for other k ''' def dp_probability(n, s, dmax = 6, dmin = 1):if s < n * dmin or s > n * dmax : return 0dp1 = [0] * (n * dmax + 1)#init dp[1, :]for i in range(1, dmax + 1):dp1[i] = 1# i: the number of dicesfor i in range(2, n + 1):dp2 = [0] * (n * dmax + 1)# j: range of i dicesfor j in range(dmin * i, dmax * i + 1):# k: range of new added dice for k in range(dmin, dmax + 1):if j > k :dp2[j] += dp1[j - k]print dp2dp1 = dp2print "total = {0}, prob = {1}%".format(dp2[s], dp2[s]*100/dmax**n)return dp2[s]轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/3903996.html
總結(jié)
以上是生活随笔為你收集整理的【剑指offer】面试题43:n个骰子的点数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP 生命周期
- 下一篇: Java虚拟机一览表