当前位置: 首页 > news >正文

n个六面的骰子,扔一次之后和为k的概率是多少?

题目要求:n个六面的骰子,扔一次之后和为k的概率是多少?给定骰子数量n和骰子的点数之和k,求概率res。

思路:动态规划dp。

问题分析:每个骰子的点数都是1~6,因此n个骰子的总点数和的范围是[n,6n],需要计算点数之和恰好等于k的方案数

1.确定dp数组及其下标的含义:dp[i][j]表示使用i个骰子,总点数和为j的方案数

2.确定递推公式:可知i个骰子的情况可以由i - 1个骰子的情况推出。

(1)因此dp[i][j] = dp[i - 1][j - 6] + dp[i - 1][[j - 5] + dp[i - 1][j - 4] + dp[i - 1][j - 3] + dp[i - 1][j - 2] + dp[i - 1][j - 1]。

(2)即:dp[i][j] = dp[i - 1][j - v] for v = 1 to 6

3.dp数组如何初始化:dp[0][0] = 1,表示使用0个骰子,总点数和为0的方案数为1。在这里没有实际意义,只用作dp数组的初始化。

4.确定遍历顺序:本题相当于分组背包问题。有n个组(每组对应一个骰子),每组有6个物品(点数1~6),每组必须且只能选1个物品,求恰好凑成总重量k的方案数。因此在使用二维数组时,组内物品的遍历顺序无所谓

附代码:

class Solution { public String probabilityOfSum(int n, int k) { // 如果 k 不在可能范围内,概率为 0 if (k < n || k > 6 * n) { return "0"; } // dp[i][s]:i 个骰子,点数和为 j 的方案数 long[][] dp = new long[n + 1][6 * n + 1]; dp[0][0] = 1; // i个骰子 for (int i = 1; i <= n; i++) { // j表示i的骰子可能的点数和,范围为[i,6 * i] for (int j = i; j <= 6 * i; j++) { // v表示第i个骰子可选点数,范围为[1,6] for (int v = 1; v <= 6; v++) { // j - v要大于等于0,因为第i个骰子的可选的点数一定不能超过点数和,否则需要排除 if (j - v >= 0) { // 因为v会从1-6中取值,所以要把这6种可能累加 dp[i][j] += dp[i - 1][j - v]; } } } } // 总方案数 = 6^n long total = (long) Math.pow(6, n); // 可选方案数 = dp[n][k] long ways = dp[n][k]; // 约分 long g = gcd(ways, total); ways /= g; total /= g; return ways + "/" + total; } // 递归求最大公约数(欧几里得算法,即辗转相除法) private long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } }

ACM模式:

import java.util.Scanner; class Solution { public String probabilityOfSum(int n, int k) { // 如果 k 不在可能范围内,概率为 0 if (k < n || k > 6 * n) { return "0"; } // dp[i][s]:i 个骰子,点数和为 j 的方案数 long[][] dp = new long[n + 1][6 * n + 1]; dp[0][0] = 1; // i个骰子 for (int i = 1; i <= n; i++) { // j表示i的骰子可能的点数和,范围为[i,6 * i] for (int j = i; j <= 6 * i; j++) { // v表示第i个骰子可选点数,范围为[1,6] for (int v = 1; v <= 6; v++) { // j - v要大于等于0,因为第i个骰子的可选的点数一定不能超过点数和,否则需要排除 if (j - v >= 0) { // 因为v会从1-6中取值,所以要把这6种可能累加 dp[i][j] += dp[i - 1][j - v]; } } } } // 总方案数 = 6^n long total = (long) Math.pow(6, n); // 可选方案数 = dp[n][k] long ways = dp[n][k]; // 约分 long g = gcd(ways, total); ways /= g; total /= g; return ways + "/" + total; } // 递归求最大公约数(欧几里得算法,即辗转相除法) private long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取骰子个数 n 和目标和 k int n = scanner.nextInt(); int k = scanner.nextInt(); // 计算结果 Solution solution = new Solution(); String result = solution.probabilityOfSum(n, k); System.out.println(result); scanner.close(); } }
http://www.jsqmd.com/news/748124/

相关文章:

  • 避坑指南:Pixhawk 4 Mini飞控与Jetson NX串口通信,从参数配置到mavros启动的完整排错流程
  • 2026四川租客车技术指南:成都租客车、成都租旅游大巴车、成都租旅游车、四川大巴包车、四川大巴租赁、四川客车租赁选择指南 - 优质品牌商家
  • SSH连接管理工具开发:从原生配置到动态化、安全化实践
  • Python爬虫实战:用requests搭配免费代理IP绕过反爬,附西刺/快代理实测代码
  • RPG+ZeroRepo:自动化代码结构管理的工程实践
  • 46.YOLOv8 实战教程:车辆检测全流程解析(含常见问题避坑)
  • poi-tl版本升级踩坑记:从1.9.1的HackLoopTableRenderPolicy到新版LoopRowTableRenderPolicy的平滑迁移指南
  • RK3588 NPU性能榨取实战:如何将YOLOv8-seg分割模型的后处理耗时从百毫秒优化到十毫秒级?
  • AI智能体安全加固实战:从威胁模型到分层防御指南
  • 2026年4月目前靠谱的生态板订购厂家推荐,泰山金砖海洋板/LP欧松板/石膏基/泰山轻钢龙骨,生态板订购厂家哪家强 - 品牌推荐师
  • 从单图到分层:layerdivider如何用AI算法重塑数字绘画工作流
  • Bifrost AI Gateway:统一AI模型调用,实现高可用与成本优化
  • 大模型KV缓存性能优化与生产环境测试实践
  • IGBT技术解析:功率半导体的革命与应用
  • 从激光笔到工业切割:一文搞懂CO2、YAG、半导体激光器到底有啥区别(附选型指南)
  • 快马平台提升proteus仿真效率,智能生成模块化电路代码
  • 47.从 0 到 1 搭建工业级 YOLOv5 目标检测系统,数据标注 + 训练 + 推理一步到位
  • Helm Chart自动化测试:使用chart-testing-action提升Kubernetes应用部署质量
  • Arm Cortex-A76处理器架构特性与常见错误解析
  • AI智能体编排框架:构建模块化多智能体系统的核心原理与实践
  • 【信创达标必过清单】:Java应用对接东方通/金蝶天燕/普元/宝兰德的4层适配验证标准(含自动化检测脚本)
  • CPU跑AI不再卡顿!llama.cpp革新本地大模型部署,让每个人电脑变身推理引擎
  • 不止于点灯:用STM32+ESP8266+手机APP打造你的第一个智能家居原型(含源码)
  • 2026年家用电梯安装公司技术实力实测对比盘点:家用电梯哪个品牌好/家用电梯定制/三层别墅电梯安装费用/专业安装家用电梯/选择指南 - 优质品牌商家
  • HS2-HF Patch终极指南:一键汉化优化你的Honey Select 2游戏体验
  • 你的Python包安装后找不到?可能是setup.py里find_packages()没配对(排查指南)
  • OmniPermission:基于RBAC扩展的Spring Boot权限管理实战指南
  • GPU加速大规模图分析:性能优化与实践指南
  • MCP协议实战:用AI助手一键发布Substack文章
  • 拯救者笔记本性能调校终极指南:Lenovo Legion Toolkit完全使用教程