掷骰子问题--动态规划

这篇博客探讨了如何使用动态规划方法解决掷骰子问题,即给定数量的骰子和每个骰子的面数,计算得到特定总和的组合数。通过避免全组合枚举,提出了优化的解决方案并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

掷骰子问题

问题描述:给定n个骰子,每个骰子有m个面(从1到m编号),找到获得总和X的方法的数量。X是抛出所有骰子时每个面的值的总和。
我们首先想到的做法是找到n个骰子所有的组合并从中计算和为X的数量,但这种做法显然不是最优的。
思路:
用Sum(m,n,X)表示从n个m面的骰子中得到和为X的方法的总和。
则Sum(m,n,X)可以如下表示

Sum(m,n,X) =  Sum(m,n-1,X-1)  //有一个骰子为1,所以剩下的n-1个骰子总和应为n-1
			+ Sum(m.n-1,X-2)  //有一个骰子为1,所以剩下的n-1个骰子总和应为n-2
			+ ...
			+ Sum(m,n-1,X-m)//有一个骰子为m,所以剩下的n-1个骰子总和应为n-m
例如当有3个骰子,每个骰子有6个面,求总和为8时,有如下表示:
Sum(6, 3, 8) = Sum(6, 2, 7) + Sum(6, 2, 6) + Sum(6, 2, 5) + 
               Sum(6, 2, 4) + Sum(6, 2, 3) + Sum(6, 2, 2)

代码如下:

class Solution{
    
    public long 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值