首页 > 其他 > 详细

【剑指Offer】面试题60. n个骰子的点数

时间:2020-05-10 00:31:29      阅读:59      评论:0      收藏:0      [点我收藏+]

题目

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

示例 1:

输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

示例?2:

输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

限制:1 <= n <= 11

思路一:递归(超时)

代码

class Solution {
public:
    vector<double> twoSum(int n) {
        vector<double> res;
        int maxSum = 6 * n, total = pow(6, n);
        vector<int> pro(maxSum - n + 1);
        helper(n, pro);
        for (int i = n; i <= maxSum; ++i) {
            res.push_back(pro[i - n] * 1.0 / total);
        }
        return res;
    }

    void helper(int n, vector<int> &pro) {
        for (int i = 1; i <= 6; ++i) {
            probability(n, n, i, pro);
        }
    }

    void probability(int original, int cur, int sum, vector<int> &pro) {
        if (cur == 1) {
            ++pro[sum - original];
        } else {
            for (int i = 1; i <= 6; ++i) {
                probability(original, cur - 1, i + sum, pro);
            }
        }
    }
};

【剑指Offer】面试题60. n个骰子的点数

原文:https://www.cnblogs.com/galaxy-hao/p/12861117.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!