// 面试题60:n个骰子的点数
// 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s
// 的所有可能的值出现的概率。 #include <iostream>
#include <math.h> int g_maxValue = ; // ====================方法一====================
//使用递归,还是会有重复计算
void Probability(int number, int* pProbabilities);
void Probability(int original, int current, int sum, int* pProbabilities); void PrintProbability_Solution1(int number)
{
if (number < )
return; int maxSum = number * g_maxValue;
int* pProbabilities = new int[maxSum - number + ];//建立一个长为maxSum - number + 1的数组,用来统计次数
for (int i = number; i <= maxSum; ++i)//初始化为0
pProbabilities[i - number] = ; Probability(number, pProbabilities);//统计次数 int total = pow((double)g_maxValue, number);
for (int i = number; i <= maxSum; ++i)
{
double ratio = (double)pProbabilities[i - number] / total;
printf("%d: %e\n", i, ratio);
} delete[] pProbabilities;
} void Probability(int number, int* pProbabilities)
{
for (int i = ; i <= g_maxValue; ++i)
Probability(number, number, i, pProbabilities);
} //划分为1个和n-1个两堆色子,然后迭代如此划分,遍历所有可能,然后pProbabilities数组相应加1
void Probability(int original, int current, int sum, int* pProbabilities)
{
if (current == )
{
pProbabilities[sum - original]++;
}
else
{
for (int i = ; i <= g_maxValue; ++i)
{
Probability(original, current - , i + sum, pProbabilities);
}
}
} // ====================方法二====================
//使用循环方法,需要找到统计新的一个色子的规律
void PrintProbability_Solution2(int number)
{
if (number < )
return; int* pProbabilities[];
pProbabilities[] = new int[g_maxValue * number + ];
pProbabilities[] = new int[g_maxValue * number + ];
for (int i = ; i < g_maxValue * number + ; ++i)//建立两个数组,初始化为0
{
pProbabilities[][i] = ;
pProbabilities[][i] = ;
} int flag = ;
for (int i = ; i <= g_maxValue; ++i)
pProbabilities[flag][i] = ;//第一个色子,每个值出现次数为1,值1~g_maxValue for (int k = ; k <= number; ++k)//从第二个色子开始统计
{
for (int i = ; i < k; ++i)
pProbabilities[ - flag][i] = ;//把另一个数组的k之前的次数清零,因为那是以前的统计结果,后面不可能出现的值 for (int i = k; i <= g_maxValue * k; ++i)//对于另一个数组而言,统计一个新的色子,其每个和的次数等于当前数组的前六个值的和
{
pProbabilities[ - flag][i] = ;
for (int j = ; j <= i && j <= g_maxValue; ++j)
pProbabilities[ - flag][i] += pProbabilities[flag][i - j];
} flag = - flag;
} double total = pow((double)g_maxValue, number);
for (int i = number; i <= g_maxValue * number; ++i)
{
double ratio = (double)pProbabilities[flag][i] / total;
printf("%d: %e\n", i, ratio);
} delete[] pProbabilities[];
delete[] pProbabilities[];
} // ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\n", n); printf("Test for solution1\n");
PrintProbability_Solution1(n); printf("Test for solution2\n");
PrintProbability_Solution2(n); printf("\n");
} int main(int argc, char* argv[])
{
Test();
Test();
Test();
Test(); Test(); Test();
system("pause");
return ;
}

《剑指offer》第六十题(n个骰子的点数)的更多相关文章

  1. 《剑指offer》 面试题43 n个骰子的点数 (java)

    引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入 ...

  2. 《剑指offer》第二十题(表示数值的字符串)

    // 面试题20:表示数值的字符串 // 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, // 字符串“+100”.“5e2”.“-123”.“3.1416”及“-1E-16 ...

  3. 《剑指offer》第十题(斐波那契数列)

    // 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; ...

  4. 《剑指offer》面试题60. n个骰子的点数

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

  5. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  6. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  7. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  8. 剑指Offer(二十五):复杂链表的复制

    剑指Offer(二十五):复杂链表的复制 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

  9. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  10. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

随机推荐

  1. game to refactor for refactor

    first step, only aim to work. it works, but i have not seen the necessaty to use class yet. my quest ...

  2. Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)

    ###继承: package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark ...

  3. Servlet向JSP过渡

    表格中添加删除链接删除相关数据,在servlet这里用的是纯java代码,在纯java代码里面的输出里面添加类似前端拼接的东西.(删除链接,并根据id来删除相应数据)这里使用的纯servlet. 在o ...

  4. modelform添加属性

    暗暗啊

  5. centos6二进制安装mysql5.5

    centos 6.5,安装mysql 5.5.60 所需安装包mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz.ncurses-devel-5.7-4.200902 ...

  6. 理解 neutron

    之前大师发个结构图. understanding_neutron.pdf 自己走读了代码: 1.  get_extensions_path() # 在/opt/stack/neutron/neutro ...

  7. sentos7为例添加python3和python2共存

    转载:https://www.cnblogs.com/JahanGu/p/7452527.html 1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命 ...

  8. mysql 中语句执行的顺序以及查询处理阶段的分析

    原文链接:http://www.php.cn/mysql-tutorials-408865.html 本篇文章给大家带来的内容是关于mysql中语句执行的顺序以及查询处理阶段的分析,有一定的参考价值, ...

  9. (4opencv)如何基于GOCW,创建一个实时视频程序

    直接使用提供的代码框架进行修改,是最快得到效果的方法:但是这样的灵活性较差,而且真正的程序员从来都不会停滞在这一步:我们需要的是"将框架解析到最小化.理清楚每个构建之间的关系",只 ...

  10. Codeforces 825E Minimal Labels - 拓扑排序 - 贪心

    You are given a directed acyclic graph with n vertices and m edges. There are no self-loops or multi ...