Probability43(n个骰子的点数)

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。

这里只求出输入n,打印出S的所有可能的值的种类数,概率除以6的次方n即可;

/**
 * @author LemonLin
 * @Description :Probability43
 * @date 2018/8/28-11:10
 *
 * 题目:n个骰子点数和及各自出现的概率
 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。
 *
 * 解题思路:使用动态规划的解决方式:
 * 1、确定问题的解的表达式:
 * 2、将最终问题的构造成上一阶段问题的解,即递推公式
 *
 * 第一步:确定问题解的表达式:  种类数 f(diceNumber,sum) :diceNumber表示为输入的骰子数,sum表示点数之和
 *
 * 第二步:确定状态转移方程,包括初始状态。
 * n个骰子点数和为s的种类数只与n-1个骰子的和有关,因为一个骰子有六个点数,当第n个骰子点数为1的话,那么
 * f(diceNumber,sum)=f(diceNumber-1,sum-1);当第n-1个骰子点数为2的话,那么f(diceNumber,sum)=f(diceNumber-1,sum-2)
 * 以此内推;所以f(diceNumber,sum)=f(diceNumber-1,sum-1)+f(diceNumber-1,sum-2)+f(diceNumber-1,sum-3)+
 * f(diceNumber-1,sum-4)+f(diceNumber-1,sum-5)+f(diceNumber-1,sum-6);
 *
 *初始状态下f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1
 */
public class Probability43 {

    /**
     *@Description
     *@params  diceNumber表示为输入的骰子数,sum表示点数之和,返回结果为种类数
     *@author LemonLin
     *@date  2018/9/1
     */
    public int getSumCount(Integer diceNumber,Integer sum){

        //判断异常输入
        if (diceNumber<1||sum<diceNumber||sum>diceNumber*6){
            return 0;
        }

        if (diceNumber==1){
            return 1;
        }
        Integer sumCount =0;
        sumCount=getSumCount(diceNumber-1,sum-1)+getSumCount(diceNumber-1,sum-2)
                +getSumCount(diceNumber-1,sum-3)+getSumCount(diceNumber-1,sum-4)
                +getSumCount(diceNumber-1,sum-5)+getSumCount(diceNumber-1,sum-6);
        return sumCount;
    }


    public static void main(String[] args) {

        /**
         * 骰子的个数5
         */
        int Count=2;
        Probability43 probability43 = new Probability43();
        for (int n=6*Count;n>=2;n--) {
            System.out.println("骰子数为"+Count+"===="+"和为"+n+"的个数为"+
                    probability43.getSumCount(Count, n));
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值