// 面试题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. Eloquent JavaScript #06# class

    索引 Notes this Prototype 类 class符号 覆盖派生属性 Maps Symbols iterator接口 Getters, setters, and statics 继承 in ...

  2. pxc集群进入非主模式怎么让最后的节点允许提供服务

    这种情况一般是,集群其他节点意外宕机而最后一个节点无法自我仲裁,而进入非主模式. 该模式拒绝任何SQL的执行: ERROR 1047 (08S01): WSREP has not yet prepar ...

  3. php 微信支付V3 APP支付

    前言:微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数. php 微信支付类 <?php class We ...

  4. SQL语句的优化方法

    减少对数据库的查询次数 尽量使用相同的或非常类似的SQL语句进行查询 避免不带任何条件的SQL语句的执行 sql语句用大写 别名的使用(1.5倍)

  5. shell脚本一键安装redis集群[最终版]

    直接上shell了. #!/bin/bash #---------------------------------------------------------------------------- ...

  6. 0x17二叉堆之超市

    题目链接:https://www.acwing.com/problem/content/147/ 容易想到一个贪心策略:在最优解中,对于每个时间(天数) t,应该在保证不卖出过期商品的前提下,尽量卖出 ...

  7. Navicat Premium 12.0.18安装与激活(转)

    转载:https://www.jianshu.com/p/42a33b0dda9c 一.Navicat Premium 12下载 Navicat Premium 12是一套数据库开发管理工具,支持连接 ...

  8. Java基础——javaMail:使用心得

    想要做一个java发送邮件小功能. 使用的maven搭建的项目. <!-- https://mvnrepository.com/artifact/javax.mail/mail -->&l ...

  9. Bootstrap3基础 disabled 多选框 鼠标放在方框与文字上都出现禁止 标识

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  10. C#开发者工具网

    使用key值[123456]对[50cms]进行对称加密-在线DES对称加密/解密- 开发者工具网  http://tool.sufeinet.com/Encrypt/DesEncrypt.aspx? ...