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

news2024/9/27 9:19:08

这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。

给定三个整数 n、k 和 target,请返回投掷骰子的所有可能得到的结果(共有 kn 种方式),使得骰子面朝上的数字总和等于 target。

由于答案可能很大,你需要对 10^9 + 7 取模。

示例 1:
输入:n = 1, k = 6, target = 3
输出:1
解释:你掷了一个有 6 个面的骰子。
得到总和为 3 的结果的方式只有一种。

示例 2:
输入:n = 2, k = 6, target = 7
输出:6
解释:你掷了两个骰子,每个骰子有 6 个面。
有 6 种方式得到总和为 7 的结果: 1+6, 2+5, 3+4, 4+3, 5+2, 6+1。

示例 3:
输入:n = 30, k = 30, target = 500
输出:222616187
解释:返回的结果必须对 109 + 7 取模。

提示:
1 <= n, k <= 30
1 <= target <= 1000

动态规划

static constexpr int MOD = 1e9+7;

class Solution {
public:
    int numRollsToTarget(int n, int k, int target) {
        vector<int> dp(target+1);
        dp[0] = 1;
        for(int i = 0; i < n; i++){
            for(int j = target; j >= 0; j--){
                dp[j] = 0;
                for(int x = 1; x <= k; x++){
                    if(j >= x){
                        dp[j] = (dp[j] + dp[j-x]) % MOD;
                    }
                }
            }
        }
        return dp[target];
    }
};

时间复杂度:O(n⋅k⋅target),即为动态规划需要的时间。
空间复杂度:O(n⋅target) 或 O(target),即为动态规划需要的空间。

分组背包:同一组内的物品至多/恰好选一个。

在这道背包问题中,采用了滚动数组的方式来优化空间。
首先我们先定义一个向量dp[j],含义是目标和为j的时候的方案数。
然后初始化dp[0]=1。
首先我们先遍历每个骰子,也就是遍历i,然后接着倒序循环从target到0的目标和,并且在每次第二层循环的时候,令dp[j] = 0,最后循环骰子可能的点数x。

当我们已经确定了某个骰子i的时候,在他之前的前i-1个骰子,已经记录到了可能产生的目标和中,所以我们在计算第i个骰子可能产生的目标和的时候,是依赖于之前骰子产生的目标和。由于骰子只能投一次,且在下面的状态转移方程dp[j] = (dp[j] + dp[j-x]) % MOD;中,dp[j]代表的是可能产生的目标和,这取决于这次骰子的点数x,dp[j-x]取决于之前骰子产生的目标和。

我们需要注意的是,我们需要在计算产生的目标和j的方法数之前,令dp[j] = 0,使结果正确。这是因为当进入第 i 次投掷循环时,我们要重新计算所有可能的点数总和。每次投掷都会通过考虑当前骰子数(x)的影响,更新 dp[j]。如果不重置 dp[j],它会保留前一次计算的值,从而导致错误的累积计算。

最后返回dp[target]即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战OpenCV之色彩空间转换

基础入门 色彩空间是描述颜色的一种数学模型&#xff0c;它定义了颜色的三个或更多维度&#xff0c;比如&#xff1a;亮度、色相和饱和度等。最著名的色彩空间之一是RGB&#xff0c;它基于人眼对光的感知原理&#xff0c;通过红、绿、蓝三种基本颜色的不同强度组合来表示几乎所…

【HarmonyOS】鸿蒙仿iOS线性渐变实现

【HarmonyOS】仿照IOS中可以通过输入start&#xff08;0&#xff0c;0&#xff09;&#xff0c;end&#xff08;1&#xff0c;1&#xff09;获取角度到.linearGradient&#xff0c;从而实现左上到右下渐变 class Point {x: number 0y: number 0 }Entry Component struct Page…

开源链动 2+1 模式 S2B2C 商城小程序:激活 KOC,开启商业新征程

摘要&#xff1a;本文深入探讨了 KOC 在立体连接中的重要性&#xff0c;以及如何通过开源链动 21 模式 S2B2C 商城小程序发现和找到更多的 KOC。强调了历史积累强关系和快速强化强关系的方法&#xff0c;并阐述了该商城小程序在推动商业发展中的关键作用。 一、引言 在当今竞争…

mysql 内存被打满记录

一&#xff1a;早上收到报警&#xff1a;提示&#xff1a;您的云数据库RDS的1个实例因存储空间满将被锁定&#xff0c;请关注实例的存储空间使用情况&#xff0c;可通过存储扩容或空间清理解除锁定。后续查看错误日志如下&#xff1a;磁盘没有空间了 没有多余的空间写binlog和…

2024年下安徽省事业编考试报名流程(电脑)

2024年下安徽省事业编考试报名流程&#xff08;电脑&#xff09;

极狐GitLab 17.4 升级指南

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab https://dl.gitlab.cn/6y2wxugm 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文分享极狐GitLab 17.4 升级…

【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收

文章目录 1. 标记-清除2. 复制算法4. 标记-整理4. 分代回收 把标记为垃圾的对象的内存空间进行释放。主要有三种释放方式 1. 标记-清除 把标记为垃圾的对象&#xff0c;直接释放掉&#xff08;最朴素的做法&#xff09; 此时就是把标记为垃圾的对象所对应的内存空间直接释放。…

【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力

目录 &#x1f354; LSTM介绍 &#x1f354; LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解LSTM内部结构及计算公式. &#x1f340; 掌握Pytorch中LSTM工具的使用. &…

反光柱定位算法-雷达强度数据包

反光柱定位算法-雷达强度数据包 反光柱定位算法-雷达强度数据包 作者&#xff1a; 苏凯 系统环境&#xff1a; 系统&#xff1a;ubuntu20.04 ros1版本&#xff1a; noetic 雷达: sick TM581 强度值标定文件&#xff1a; scanIntensities.txt 部署在环境中的反光柱数据…

类和对象(2)

文章目录 &#x1f3af;引言&#x1f453;类和对象(2)1.类的默认成员函数2.构造函数2.1构造函数概念 3.析构函数3.1. **析构函数的定义**3.2. **析构函数的特点** 4.拷贝构造函数4.1. **拷贝构造函数的定义** 5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3日期类的实现 &…

smtp-server: 535 Error: authentication faile

问题描述&#xff1a; 在linux服务器上使用 mailx发送邮件时提示&#xff1a;smtp-server: 535 Error: authentication faile 原因&#xff1a;没有配置授权码或者授权码不正确 解决办法&#xff1a;配置授权码(以网易邮箱为例) 1. 进入网易邮箱网页版&#xff0c;打开 POP…

数据中心里全速运行的处理器正在浪费能源

数据中心是耗电大户&#xff0c;运营商一直在努力解决的一个关键问题是如何减少能源和资源消耗。人们已经找到了一些巧妙的解决方案&#xff0c;例如使用非饮用水来冷却设备&#xff0c;但一个显而易见的解决方案似乎被忽略了&#xff1a;启用处理器的各种省电功能。 随着需求的…

进程概念以及进程相关函数的使用

1.进程相关概念 1.1 程序和进程 程序&#xff0c;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源(cpu、内存、打开的文件、设备、锁....) 进程&#xff0c;是一个抽象的概念&#xff0c;与操作系统原理联系紧密。进程是活跃的程序&#xff0c;占用系…

Qt-QGroupBox容器类控件(39)

目录 容器类控件 描述 属性 使用 容器类控件 描述 这个是用来分组的&#xff0c;即把控件分组 使⽤ QGroupBox 实现⼀个带有标题的分组框.可以把其他的控件放到⾥⾯作为⼀组.这样看起来能更好看⼀点 属性 title分组框的标题alignment分组框内部内容的对⻬⽅式flat是否是…

微服务nacos解析部署使用全流程

1、什么是Spring Cloud Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。…

stm32入门——GPIO输入输出(1)基础理解

最近比较想上进&#xff0c;又不知道要干什么&#xff0c;就来水几篇博客欺骗一下自己。 GPIO全称是&#xff1a;General Purpose Input / Output ,是stm32用于控制输入和输出信号的通用接口。我们用的MCU都有这玩意&#xff0c;比如STM32F103C8T6上有 GPIOA&#xff0c;GPIOB&…

算法葫芦书(笔试面试)

一、特征工程 1.特征归一化&#xff1a;所有特征统一到一个区间内 线性函数归一化&#xff08;0到1区间&#xff09;、零均值归一化&#xff08;均值0&#xff0c;标准差1&#xff09; 2.类比型特征->数值性特征 序号编码、独热编码、二进制编码&#xff08;010&#xf…

prd文档编写(to b)

如何编写产品需求文档&#xff08;PRD&#xff09; | 人人都是产品经理 (woshipm.com) 一.prd文档编写得目的 PRD文档最为重要的目的就是&#xff1a;协调各个相关角色 PRD就是提高效率的&#xff0c;把各个角色的共识全部写出来&#xff0c;大家都已PRD为最终的工作指导文档…

2:数据结构:列表与元组

目录 2.1 列表的创建与操作 2.1.1 列表的创建 2.1.2 列表的常用操作 2.1.3 列表切片操作 2.2 元组的特点与用法 2.2.1 元组的创建 2.2.2 元组与列表的区别 2.2.3 元组的常用操作 2.3 示例代码与练习 2.3.1 示例代码&#xff1a;列表与元组的基本操作 2.3.2 练习题 文…

ICM20948 DMP代码详解(46)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;45&#xff09; 上一回讲到了inv_icm20948_setup_compass_akm函数中的以下代码片段&#xff1a; /* Set compass in power down through I2C SLV for compass */result inv_icm20948_execute_write_secondary(s, COM…