LeetCode 377.组合总和IV 可解决一步爬m个台阶到n阶楼顶问题( 完全背包 + 排列数)

news2024/12/24 2:19:50

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

>>思路和分析

本题中顺序不同的序列被视为不同的组合,其实就是求排列!

(1)区分组合和排列:

组合不强调顺序,(1,5) 和 (5,1)是同一个组合

排列是强调顺序,(1,5) 和 (5,1)是两个不同的排列

可知本题的本质求的是排列总和,且仅仅求的是排列总和的个数,并不是把所有的排列都列出来~

若本题需要把排列都列出来的话,只能用回溯算法暴搜!

>>动规五部曲分析如下:

1.确定dp数组以及下标的含义

        dp[j] : 凑成目标正整数为 j 的排列个数为 dp[j]

2.确定递归公式

        dp[j] (考虑nums[i])可以由dp[j - nums[i]] (不考虑nums[i]) 推导出来

因为只要得到 nums[i],排列个数 dp[j - nums[i]],就是dp[i]的一部分

动态规划:494.目标和 和 动态规划:518.零钱兑换II 中我们已经讲过了,求装满背包有几种方法,递推公式一般都是 dp[j] += dp[j-nums[i]]; 本题一样!

3.dp数组初始化

因为 dp[j] += dp[j - nums[i]] ,所以dp[0]要初始化为1,这样递归其他dp[j]的时候才会有数值基础

dp[0] = 1;其实是没有意义的,因为题目中说了,给定的目标值是正整数,所以dp[0] = 1是没有意义的,仅仅是为了推导递推公式。

非0下标的dp[j] 应该初始为0,这样才不会影响dp[j] 累加所有的 dp[j - nums[i]];

4.确定遍历顺序

个数是可以不限制使用的,所以本题可以使用完全背包来解决得到的集合是排列,说明需要考虑元素之间的顺序。因为本题要求的是排列,那么需要格外注意for循环嵌套的顺序~

在动态规划:518 零钱兑换II 中讲到:

  • 如果求组合数就是外层 for 循环遍历物品,内层for循环遍历背包
  • 如果求排列数就是外层 for 循环遍历背包,内层for循环遍历物品

举个例子:计算dp[4]时,结果集想要有{1,3},{3,1}这两个集合,那么得先遍历背包,再遍历物品,才可以;反之则结果集只有{1,3}这样的集合。

因此可以确定本题遍历顺序最终的遍历顺序为:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前向后遍历(完全背包)

5.举例来推导dp数组

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target+1,0);
        dp[0] = 1;
        // 排列数
        for(int j = 0;j <= target;j++) { // 背包
            for(int i=0;i < nums.size();i++) { // 物品
                if(j >= nums[i] && dp[j] < INT_MAX - dp[j - nums[i]])
                    dp[j] += dp[j-nums[i]];
            }
        }
        return dp[target];
    }
};

// [0-i] 装满背包为j 有dp[j]种
// dp[j] += dp[j-nums[i]]
  • 时间复杂度:O(target * n),其中 n 为nums的长度
  • 空间复杂度:O(target)

C++测试用例有两个数相加超过int的数据,所以需要在 if 里加上dp[j] < INT_MAX - dp[j - nums[i]]

参考和推荐文章、视频:

代码随想录 (programmercarl.com)

动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili

往期文章:

完全背包 动态规划 + 一维dp数组

LeetCode 518.零钱兑换II 动态规划 + 完全背包 + 组合数

【总结】

  • 求装满背包有几种方法,递归公示都是一样的,没有差别,但关键在于遍历顺序!
  • 本题与动态规划:518.零钱兑换II 的区别,一个是求排列数,一个是求组合数,遍历顺序完全不同。

来自代码随想录的课堂截图! 

爬楼梯拓展成一步可以爬m个台阶,这个代码怎么写?思路是怎么样的?

leetCode 70.爬楼梯 动态规划_呵呵哒( ̄▽ ̄)"的博客-CSDN博客

好问题:若一步一个台阶,两个台阶,三个台阶,直到 m 个台阶,有多少种方法爬到n阶楼顶。一步可以爬几个台阶,其实就是相当于每个物品,有多少种不同的方法可以爬到楼顶,相当于装满这个背包有多少种方法。比如:如果说我们先爬了一步再爬两步,再爬一步可到楼顶。和我们先爬一步,再爬一步,后爬了两步到了楼顶。请问这是几种爬楼梯的方法?很明显,这是两种方法所以说爬楼梯的话,我们求的这个集合的个数,我们要强调元素的顺序,所以说和本题(leetCode 377.组合总和IV)是一样的。同样是强调元素之间的顺序的,也就是说 {1,2,1} 和 {1,1,2} 这是两个集合,要分别来计数。

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n + 1,0);
        dp[0] = 1;
        int m = 2;// m 表示一步最多可以爬多少个台阶
        for(int j = 1;j <= n; j++) { // 背包
            for(int i = 1;i <= m; i++) { // 物品
                if(j >= i)
                    dp[j] += dp[j-i];
            }
        }
        return dp[n];
    }
};

代码中m表示最多可以爬m个台阶,代码中把m改成2就是本题70.爬楼梯可以AC的代码了。

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

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

相关文章

Spring源码篇(十)@Bean怎么注册一个bean

文章目录 前言配置类里的Bean解析sourceClass是什么解析Bean方法添加Bean注解的方法信息注册总结Bean注册的过程注意点 前言 配置类的解析之前有聊过&#xff0c;这篇也会涉及到一部分&#xff0c;因为Bean本身也是配置类里的一个东西&#xff0c;本篇会着重解析Bean注册bean的…

区块链(6):p2p去中心化介绍

1 互联网中中心化的服务和去中心化服务的概念介绍 目前的互联网公司大都是中心化的 区块链网络大多是去中心化的 去中心化 2 p2p的简单介绍 java 网络编程:socket编程,netty编程,websoket简单介绍 2.1 节点是如何提供服务的(web编程实现)

qml保姆级教程一:布局组件

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一&#xff1a;布局组件 文章目录 锚布局anchors属…

前端开发 vs. 后端开发:编程之路的选择

文章目录 前端开发&#xff1a;用户界面的创造者1. HTML/CSS/JavaScript&#xff1a;2. 用户体验设计&#xff1a;3. 响应式设计&#xff1a;4. 前端框架&#xff1a; 后端开发&#xff1a;数据和逻辑的构建者1. 服务器端编程&#xff1a;2. 数据库&#xff1a;3. 安全性&#…

CISSP学习笔记:人员安全和风险管理概念

第二章 人员安全和风险管理概念 2.1 促进人员安全策略 职责分离: 把关键的、重要的和敏感工作任务分配给若干不同的管理员或高级执行者&#xff0c;防止共谋工作职责:最小特权原则岗位轮换:提供知识冗余&#xff0c;减少伪造、数据更改、偷窃、阴谋破坏和信息滥用的风险&…

CSS详细基础(四)显示模式

本帖开始介绍CSS中更复杂的内容 目录 一.显示模式 1.行内元素 2.块级元素 3.行内块元素 二.背景样式 一.显示模式 顾名思义&#xff0c;在CSS中&#xff0c;元素主要有3种显示模式&#xff1a;行内元素、块级元素、行内块元素~ 所谓块级元素&#xff0c;指的是该元素在…

Springboot+vue的企业人事管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的企业人事管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业人事管理系统&#xff0c;采用M&#xff08;model&am…

【kylin】【ubuntu】搭建本地源

文章目录 一、制作一个本地源仓库制作ubuntu本地仓库制作kylin本地源 二、制作内网源服务器ubuntu系统kylin系统 三、使用内网源ubuntukylin 一、制作一个本地源仓库 制作ubuntu本地仓库 首先需要构建一个本地仓库&#xff0c;用来存放软件包 mkdir -p /path/to/localname/pac…

基于微信小程序的手机在线商城小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

摩根大通限制英国客户购买加密货币,市场掀起涟漪!

摩根大通旗下英国数字银行部门宣布&#xff0c;从下个月开始&#xff0c;将禁止客户进行加密货币交易。这一决定归因于人们越来越担心与加密货币相关的诈骗和欺诈行为的增加。 正如该银行周二表示的那样&#xff0c;从10月16日起&#xff0c;该银行的客户将不再可以选择通过借…

Bee2.1.8支持Spring Boot 3.0.11,active命令行选择多环境,多表查改增删(bee-spring-boot发布,更新maven)

天下大势&#xff0c;分久必合&#xff01; Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee Spring Cloud 微服务使用数据库更方便&#xff1a;Bee Spring Boot; 轻松支持多数据源&#xff0c;Sharding, Mongodb. 要整合一堆的…

数据大帝国:大数据与人工智能的巅峰融合

文章目录 大数据与人工智能&#xff1a;概念解析大数据与人工智能的融合1. 数据驱动的决策2. 自然语言处理&#xff08;NLP&#xff09;3. 图像识别与计算机视觉4. 智能推荐系统5. 医疗诊断和生命科学 数据大帝国的未来展望1. 智能城市2. 区块链和数据安全3. 自动化和机器人4. …

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合 什么是聚合&#xff1f; 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售情况如…

Linux CentOS7 vim临时文件

在vim中&#xff0c;由于断网、停电、故意退出、不小心关闭终端等多种原因&#xff0c;正在编辑的文件没有保存&#xff0c;系统将会为文件保存一个交换文件&#xff0c;或称临时文件&#xff0c;或备份文件。 如果因某种原因产生了交换文件&#xff0c;每次打开文件时&#x…

多线程总结(线程池 线程安全 常见锁)

本篇文章主要是对线程池进行详解。同时引出了单例模式的线程池&#xff0c;也对线程安全问题进行了解释。其中包含了智能指针、STL容器、饿汉模式的线程安全。也对常见的锁&#xff1a;悲观锁&#xff08;Pessimistic Locking&#xff09;、乐观锁&#xff08;Optimistic Locki…

使用GDIView排查GDI对象泄漏导致的程序UI界面绘制异常问题

目录 1、问题说明 2、初步分析 3、查看任务管理器&#xff0c;并使用GDIView工具分析 4、GDIView可能对Win10兼容性不好&#xff0c;显示的GDI对象个数不太准确 5、采用历史版本比对法&#xff0c;确定初次出现问题的时间点&#xff0c;并查看前一天的代码修改记录 6、将…

visual studio下载安装

一、官网下载 地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 点击免费visual studio 二、安装 运行下载好的exe文件&#xff0c;自定义安装目录 三、选择需要的组件安装 只需要选择标记组件&#xff0c;然后点击安装 等待安装完成就行 四、重启电脑 安装完之后…

windows系统关闭软件开机自启的常用两种方法

win10中安装软件时经常会默认开机自启动&#xff0c;本文主要介绍两种关闭软件开机自启动方法。 方法1 通过任务管理器设置 1.在任务管理器中禁用开机自启动&#xff1a;打开任务管理器&#xff0c;右键已启动的软件&#xff0c;选择禁用。 方法2 通过windows服务控制开机自启…

SpringBoot——常用注解

Spring Web MVC与Spring Bean注解 Controller/RestController Controller是Component注解的一个延伸&#xff0c;Spring 会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。 Controller RequestMapping("/api/v1") public class UserApiContr…

ssm+vue的OA办公管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的OA办公管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…