博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
n个骰子的点数
阅读量:5957 次
发布时间:2019-06-19

本文共 1986 字,大约阅读时间需要 6 分钟。

剑指offer上43题

n个骰子,朝上一面的点数之和为S,求S的所有可能的值的概率

有两种方法 1.递归

2.动态规划 f(n) = f(n-1)+f(n-2)+....+f(n-6);

贴代码:

package testAbstractClass;public class xiecheng {    //有n个骰子,所有朝上的点数之和为S 求S的所有可能值出现的概率。    public static int six=6;    public static void main(String args[]){        //printpro(2);        printProbability(2);            }         //以下为递归解法    public static void printProbability(int n){        if(n<1) return;        int maxsum = n*six;        int minsum = n*1;        //将和为s的出现次数放在s-n个位置 index=s-n;index一共是0-5n        int [] mark_num = new int [maxsum-minsum+1];//自动初始化为0;        probability(n, mark_num);               int total = (int) Math.pow(six, n);//总共的可能数目为6^n        for(int i=n;i<=maxsum;i++){            double ratio = (double)mark_num[i-n]/total;            System.out.println("和为"+i                    +"出现的概率是"+ratio);        }    }    //获取所有的可能 并将出现的次数存在一个5n+1的数组中;    public static void probability(int n,int [] mark_num){        for(int i =1;i<=six;i++){            probability(n,n,i,mark_num);        }    }    //递归实现 将n个骰子,目前递归到序号,目前的和,以及标记数组传进来。当序号递归6次 就完成一次记录 ,将对应位置上的值加1    public static void probability(int original,int current,int sum,int [] mark_sum){        if(current==1) mark_sum[sum-original]++;        else{            for(int i=1;i<=six;i++){                probability(original,current-1,i+sum,mark_sum);            }        }        }         }

 

第二种方法是动态规划,记录前一轮状态中的骰子的值 

/**     * 解法2 动态规划法;用两个数组存储骰子点数的每一个总数出现的次数: 数组的第n个数字达标骰子和为n出现的次数,     * 在下一轮循环中,加上一个新的骰子,此时和为n的骰子出现的次数应该等于上一轮骰子点数为n-1,n-2,n-3,n-4,n-5,n-6的次数总和。     * f(n) = f(n-1)+...f(n-6);     */    public static  void printpro(int n){        int [][] pro =  new int [2][six*n+1];                        int flag =0;        //第一个骰子的状态 就是dp的出示状态        for(int i=1;i<=six;i++) pro[flag][i] =1;        //第二个骰子到第n个骰子        for(int j=2;j<=n;j++){            //将前0-j置零 因为j个骰子 点数最少都是j*1            for(int i=0;i

第二种方法时间上效率较高。只比第一种方法多费了o(n)的空间。

转载于:https://www.cnblogs.com/CongLollipop/p/6636413.html

你可能感兴趣的文章
py2与py3差别
查看>>
windows知识点
查看>>
第五章多态课后java_Java程序设计课后练习答案
查看>>
idea无用插件_没用过这些IDEA插件?怪不得写代码头疼
查看>>
linuxliveu盘怎么用_怎么用U盘重装系统?
查看>>
国际学院c语言作业,C语言程序的国际化
查看>>
四阶龙格库塔法c语言程序,四阶龙格库塔法C语言(西安交大)
查看>>
c语言中无windows函数库,关于C语言, GCC/MSVC中,如何写出一个真正意义上的不依赖库的程序?...
查看>>
欧洲语言框架A1到C2,法语等级 A1、A2、B1、B2、C1、C2
查看>>
c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作
查看>>
c语言编程 企业发放,求c语言编程企业员工全年销售额统计及奖金发放系..._统计师_帮考网...
查看>>
C语言编辑中午和英语库,懂英语和C语言的来
查看>>
c语言cabd快速查询的方法,滨州医学院 数据结构C语言版习题精选
查看>>
c语言中秋log10的函数,10本科生的C++成长轨迹7 - ACM培训:数组&函数&指针
查看>>
android 设备运营商,Android设备悲剧:新技术让运营商可以向设备“偷偷”安装软件...
查看>>
html语言link,HTML <link>标签
查看>>
html最小化打开新页面,【html相关】html中如何实现在新标签中打开另一个新的页面?...
查看>>
在html中加入tablestyle,html表格table的使用,以及表格的css样式
查看>>
android全屏监听,Android SurfaceView实现全屏播放例子
查看>>
html console 滚动条,JavaScript - 控制滚动条操作
查看>>