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

本文共 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

你可能感兴趣的文章
宇瞻U盘出现无法格式化 写保护的完美解决办法 厂家提供的
查看>>
Hadoop概念学习系列之Hadoop的文件系统(十六)
查看>>
C++ 打开exe文件的方法(VS2008)
查看>>
Windows服务安装后自动启动
查看>>
IGT中国
查看>>
Android消息循环分析
查看>>
11. 系统状态管理
查看>>
Java:java+内存分配及变量存储位置的区别
查看>>
PHP 字符串编码的转换
查看>>
往文件中按行写入数据
查看>>
20. Screen
查看>>
整个站点默认禁用 Session,而某个页面不禁用的做法。
查看>>
ios实例开发精品源码文章推荐(8.22)
查看>>
ElasticSearch 应用场景
查看>>
《数据库技术基础与应用(第2版)》学习笔记——第1章
查看>>
Tomcat性能调优方案
查看>>
Ubuntu12.04上编译PlateGatewayQt
查看>>
(转)UITableView使用详解 相当详细,不错的东东
查看>>
Java中JDK,JRE和JVM之间的关系
查看>>
Python-NLTK环境搭建
查看>>