Leetcode1155. 掷骰子等于目标和的方法数

【C++动态规划 分组背包】1155. 掷骰子等于目标和的方法数|1653 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。 给定三个整数 n、k 和 target,请返回投掷骰子的所有可能得到的结果(共有 kn 种方式),使得骰子面朝上的数字总和等于 target。 由于答案可能很大,你需要对 10^9^ + 7 取模。 阅读详情

Every day a Leetcode

题目来源:1155. 掷骰子等于目标和的方法数

解法1:动态规划

设置状态转移矩阵:

vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));

也可以设成 n*k+1 的大小,大部分情况下设置成 target+1 能节省内存。

初始化时,我们丢第一个骰子,出现 1~k 点数:

// 初始化
for (int i = 1; i <= k && i <= target; i++)
	dp[1][i] = 1;

从上一层结果,丢一个骰子,状态转移到下一层。

设 i 为丢的骰子数,j 为当前层的总点数,x 为当前丢骰子的点数,枚举 x = 1~k,j-x 就是上一层丢的总点数,在满足 j - x >= i - 1 && j - x <= k * (i - 1)的条件下,dp[i][j] += dp[i - 1][j - x],在与 MOD( 1e9 + 7) 取余。

条件j - x >= i - 1 && j - x <= k * (i - 1)的意思是:

前 i-1 个骰子至少要丢 i-1 个点数,最多丢 k * (i - 1) 个点数。事实上,只限定 j - x >= 1 也能通过这些样例。

状态转移方程:

// 动态规划
for (int i = 2; i <= n; i++)
	for (int j = 0; j <= target; j++)
	{
		for (int x = 1; x <= k; x++)
			if (j - x >= i - 1 && j - x <= k * (i - 1))
				dp[i][j] = (dp[i][j] + dp[i - 1][j - x]) % MOD;
	}

代码:

/*
 * @lc app=leetcode.cn id=1155 lang=cpp
 *
 * [1155] 掷骰子等于目标和的方法数
 */

// @lc code=start
class Solution
{
private:
    static const int MOD = 1e9 + 7;

public:
    int numRollsToTarget(int n, int k, int target)
    {
        vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));
        // 初始化
        for (int i = 1; i <= k && i <= target; i++)
            dp[1][i] = 1;
        // 动态规划
        for (int i = 2; i <= n; i++)
            for (int j = 0; j <= target; j++)
            {
                for (int x = 1; x <= k; x++)
                    if (j - x >= i - 1 && j - x <= k * (i - 1))
                        dp[i][j] = (dp[i][j] + dp[i - 1][j - x]) % MOD;
            }
        return dp[n][target];
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n * k * target)

空间复杂度:O(n * target)

YOLO项目从零开始:超详细运行教程(图文保姆级教学) 至此,我们已经完整跑通了YOLO项目的安装与启动流程,无论你是零基础小白还是刚入门的AI新兵,只要按部就班操作,也能轻松实现目标检测项目的落地。 阅读详情

相关推荐

别再只会用串口助手了!手把手教你用手机App调试HC-05蓝牙模块(STM32F103实战)

本文详细介绍了如何利用手机App调试HC-05蓝牙模块与STM32F103的无线连接,突破传统串口助手的限制。通过实战指南,开发者可以掌握移动性测试、实时监控和快速验证等高效调试技巧,优化蓝牙透传的稳定性和性能。

weixin_33670786的博客 428

LeetCode之1155. 掷骰子的N种方法(附DP详细解析思考过程)

1155. 掷骰子的N种方法(DP)题目分析回溯法动态规划记录自己的思考DP解法代码 一道动态规划题,虽然自己思考的方向有问题,但是还是值得记录一下,毕竟思考了。 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, …, f。 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。 如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。 示例 1: 输入:d = 1, f = 6, tar

剑指Offer编程题 1593

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 377

LeetCode 1155. 掷骰子的N种方法 每日一题

LeetCode 1155. 掷骰子的N种方法 每日一题

lishifu_的博客 955

Zynq7000混合启动方案:QSPI Flash引导与eMMC ext4文件系统部署实战

本文详细介绍了Zynq7000平台的混合启动方案,结合QSPI Flash引导与eMMC ext4文件系统部署,解决嵌入式Linux系统启动可靠性与大容量存储需求。通过硬件连接配置、分区规划、Petalinux工程配置及实战部署步骤,帮助开发者高效实现系统优化,提升启动速度和文件系统性能。

weixin_29190169的博客 448

华为Atlas 300I推理卡驱动安装避坑指南:不同安装方式的选择与优化

本文详细解析华为Atlas 300I推理卡驱动安装的三种主流方式(.run、.rpm和源码编译),提供关键环境检查步骤、安装流程优化建议及常见问题解决方案,帮助开发者高效完成芯片推理卡部署并规避典型安装陷阱。

q9w8e7r6t5的博客 433

LeetCode 1155. Number of Dice Rolls With Target Sum

[Med] LeetCode 1155. Number of Dice Rolls With Target Sum 链接: https://leetcode.com/problems/number-of-dice-rolls-with-target-sum/ 题目描述: You have d dice, and each die has f faces numbered 1, 2, …, f. ...

MrJustin的博客 442

构建 Skill 的完整指南

Skill开发指南摘要 Skill是用于定制Claude AI行为的指令包,包含SKILL.md主文件及可选脚本、参考文档和资源。本文提供了完整的Skill开发指南: 核心概念 三层渐进式披露结构(元数据/主指令/参考文档) 支持独立工作流和MCP集成 跨平台兼容性(Claude.ai/ClaudeCode/API) 开发流程 规划:明确2-3个具体用例 结构要求:kebab-case命名、必备YAML元数据 编写规范:清晰触发条件、分步指令、错误处理 典型应用模式 • 文档生成(类别1) • 工作流自动化

wjianwei666的专栏 303

Leetcode1155:掷骰子的N种方法

Leetcode1155:掷骰子的N种方法 题目: 这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。 给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。 答案可能很大,你需要对 109 + 7 取模 。 思路:分组背包 代码如下: class Solution { int mod = (int)1e9+7; public int numRoll

immortalize的博客 401

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

726

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 770

Leetcode 1155. 掷骰子的N种方法 (经典背包)

class Solution { const int MOD = (int)1e9 + 7; public: int numRollsToTarget(int d, int f, int target) { vector<vector<int>> dp(d+1, vector<int>(target + 1)); dp[0][0] = 1; for (int i = 1; i <= d; i++) ...

wwxy1995的博客 372

YOLO11改进:轻量级改进 | 通用倒瓶颈(UIB)搜索块结合C3k2二次创新 | 轻量化之王MobileNetV4

通用倒瓶颈(UIB)搜索块替代YOLO11的C3k2

会AI的学姐 294

leetcode_1155 掷骰子等于目标和的方法数

leetcode_1155 掷骰子等于目标和的方法数

bdn_nbd的博客 272

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode 1155. 掷骰子等于目标和的方法数

leetcode 1155. 掷骰子等于目标和的方法数

qq_62172019的博客 323

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

力扣 1155. 掷骰子等于目标和的方法数(动态规划-java)

给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target。代表在不考虑任何物品组的情况下,只有凑成总价值为0 的方案数为 1,凑成其他总价值的方案不存在。不失一般性考虑 f[i][j]f[i][j] 该如何转移,也就是考虑第 ii 个物品组有哪些决策。分组背包不仅仅有「组内物品最多选择一个」的情况,还存在「组内物品必须选择一个」的情况。f[i][j] 表示:表示考虑前i 个物品组,凑成价值为j 的方案数。

SP_1024的博客 916

LeetCode:1155. 掷骰子等于目标和的方法数(C++)

这个清零的操作确保了在每个迭代中,f[j] 包含了只考虑当前骰子面值的组合数,而不会累积之前迭代的结果。这是解决问题的关键,以确保计算的正确性,因为你不能跳过任何一个骰子的面值,而传统的分组背包是可以跳过的。

Cosmoshhhyyy的博客 306

leetcode刷题:1155_掷骰子等于目标和的方法数

也就是说,当我们计算 f(i,j) 时,一维数组中下标大于 j 的位置都是 f(i,⋯ ) 的值,下标小于 j 的位置都是 f(i−1,⋯ ) 的值,这样就保证了 f(i,j) 结果的正确性。注意到状态转移放曾中,f(i,j)只会从 f(i−1,⋯ ) 转移而来,因此我们只需要存储当前行(第 i 行)和上一行(第 i−1 行)的值,即可以用两个一维数组代替上面代码中的二维数组 f 进行状态转移。得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。解释:你扔一个有 6 个面的骰子。

weixin_44090706的博客 248

leetcode 1155. Number of Dice Rolls With Target Sum 掷骰子等于目标和的方法数

Problem:使用了动态规划的,dp[i][j]代表使用i个骰子累加和是j的方法数,0个骰子累加和是0的方法树初始化到1,dp[0][0] = 1当少了一个骰子的时候,累加和应该相应的减少1~min(j, k)dpijdpij∑dpi−1w−kk,kk的区间是(1, min(k, j))也可理解成最后一个骰子固定成kk,前i-1个骰子累加和是w-kk的总数的累加和。

邹九的个人博客 256

Leetcode 【1155. 掷骰子等于目标和的方法数】

得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。中心思想还是dp的那个递归方程,方法二用了缓存来避免重复计算。种方式中)滚动骰子的数量,使正面朝上的数字之和等于。返回的结果必须是对 109 + 7 取模。你扔两个骰子,每个骰子有 6 个面。个一样的骰子,每个骰子上都有。你扔一个有 6 个面的骰子。得到 3 的和只有一种方法。,返回可能的方式(从总共。答案可能很大,你需要对。

Kitsuha的博客 353

leetcode1155. 掷骰子等于目标和的方法数

有 6 种方式得到总和为 7 的结果: 1+6, 2+5, 3+4, 4+3, 5+2, 6+1。,请返回投掷骰子的所有可能得到的结果(共有。种方式),使得骰子面朝上的数字总和等于。返回的结果必须对 109 + 7 取模。得到总和为 3 的结果的方式只有一种。你掷了两个骰子,每个骰子有 6 个面。个一样的骰子,每个骰子上都有。你掷了一个有 6 个面的骰子。由于答案可能很大,你需要对。

Turboyiyi的博客 338

【动态规划-分组背包】力扣1155. 掷骰子等于目标和的方法数

当我们已经确定了某个骰子i的时候,在他之前的前i-1个骰子,已经记录到了可能产生的目标和中,所以我们在计算第i个骰子可能产生的目标和的时候,是依赖于之前骰子产生的目标和。首先我们先遍历每个骰子,也就是遍历i,然后接着倒序循环从target到0的目标和,并且在每次第二层循环的时候,令dp[j] = 0,最后循环骰子可能的点数x。中,dp[j]代表的是可能产生的目标和,这取决于这次骰子的点数x,dp[j-x]取决于之前骰子产生的目标和。首先我们先定义一个向量dp[j],含义是目标和为j的时候的方案数。

sjsjs11的博客 612

leetcode-1155. 掷骰子等于目标和的方法数-DFS+DP

力扣每日1题。

yjj1123456的博客 235

【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】

【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。 给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。 答案可能很大,你需要对 109 + 7 取模 。

Coder_ljw的博客 747

每日一题:leetcode1155 掷骰子等于目标和的方法数

dp[i][j] = dp[i][j] + dp[i-1][j-x],其中x的范围是[1-k],i表示几个骰子,j表示这i个骰子能加到的范围,dp[i][j]则表述i个骰子达到j值的方法数。首先看到这个是求方法数,就让我想起了超级楼梯这个递推的动态规划题目,再看看这个数据的规模才1000,直接就是有着异曲同工的思路。当然需要进行一些分支截取,骰子的范围,最小值就是1,最大是k,那么数据的范围就是[n,n*k]。得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。

Stray_Lambs的博客 360

LeetCode刷题日记(1155. 掷骰子等于目标和的方法数)

动态规划的好处在于它能够显著减少计算时间,通过利用已解决的子问题来快速解决更大的问题,因此在处理复杂的组合优化和最优化问题时特别有用。第i个骰子有k个面,从1到k,我们可以选择任意一个面的点数。这是因为前i个骰子和为j的方法可以由前i-1个骰子和为j-x的方法累加得到,其中x是当前骰子的点数。动态转移方程的构建是动态规划问题中的关键步骤,它描述了问题的子问题之间的关系,以便从小的子问题逐步构建出更大的问题的解。其中,i表示当前骰子的序号,j表示当前和的值,k表示骰子的面数。

weixin_45401894的博客 156

【Leetcode每日一题】「动态规划」1155.掷骰子等于目标和的方法数

1.确定dp数组如何确立:答案要求返回的是达到target的种数那么我们的这个dp数组代表的就是达到target的种数,还有现在在掷那个骰子和当前掷骰子的和需要表示,那么我们的dp数组就要这么设计:dp[当前在掷那个骰子][当前掷骰子的和]=达到这个和的种数;4. 确定dp推导公式:我们dp代表的是数量,l代表当前骰子投的数的话就是当前dp[i][j]可以达到的种数加上投l的种数dp[i-1][j-l]的种数也就是: dp[i][j]=(dp[i][j]+dp[i-1][j-l]);dp[0][0]=1;

c0re的博客 507
上一篇: Qt 项目实战 | 多界面文本编辑器
下一篇: Leetcode970. 强整数
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值