zoukankan      html  css  js  c++  java
  • n个骰子的和

    剑指Offer:面试题43

    把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。求s的所有可能值出现的次数。

    比如扔两个骰子,s的可能值为2-12,出现的次数分别为:1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1

    Solution

    # 在一次循环中,一个数组中的第n个元素表示骰子和为n出现的次数。
    # 在下一次循环中,加上一个新的骰子,此时和为n出现的次数等于上一次和为n-1,n-2 ...,n-6出现的次数之和,
    # 所以把另一个数组中的第n个元素设为前一个数组的第n-1,n-2 ...,n-6个元素之和。
    
    def sumOfS(number, maxValue): # number: 总共骰子数, maxValue: 每个骰子的最大点数
        if number < 1:
            return None
        res = [[0 for i in range(maxValue * number + 1)],[0 for j in range(maxValue * number + 1)]]
        flag = 0
        for i in range(1, maxValue + 1):
            res[flag][i] = 1
        for k in range(2, number + 1):  # 当有k个骰子的情况
            for i in range(k):
                res[1-flag][i] = 0  # 小于k的位置置0
            for i in range(k, maxValue * k + 1):
                res[1-flag][i] = 0
                j = 1
                while j <= i and j <= maxValue:
                    res[1-flag][i] += res[flag][i-j]
                    j += 1
            flag = 1 - flag
        return res[flag]
    
  • 相关阅读:
    PHP获取汉字拼音首字母
    记录,待总结5
    HDU2833 WuKong Floyd
    搜索
    记录,待总结4
    HDU3350 #define is unsafe 栈的应用
    指针与引用的混合使用总结
    多源最短路径 Floyd
    引用总结
    函数返回值总结
  • 原文地址:https://www.cnblogs.com/binwone/p/6133652.html
Copyright © 2011-2022 走看看