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

LeetCode377. 组合总和 Ⅳ

377. 组合总和 Ⅳ

文章目录

    • [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)
      • 一、题目
      • 二、题解
        • 方法一:完全背包一维数组
          • 动态规划思路
          • 代码分析
        • 方法二:动态规划二维数组


一、题目

给你一个由 不同 整数组成的数组 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 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

进阶:如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?

二、题解

这道题要求我们找出由给定数组 nums 中的不同元素组成的总和等于 target 的组合个数,说是组合,其实实质上是排列,我在这篇文章里讲述了关于排列组合的区别并且手写了动态规划过程:https://blog.csdn.net/m0_61843614/article/details/132745696。

方法一:完全背包一维数组

动态规划思路

定义一个一维数组 dp,其中 dp[i] 表示总和为 i 的组合个数。

我们的目标是计算 dp[target],也就是总和为 target 的组合个数。为了计算 dp[target],可以考虑如下的思路:

  1. 初始化一个长度为 target + 1 的数组 dp,并将其所有元素初始化为0。dp[i] 表示总和为 i 的组合个数。

  2. 由于组合的元素可以重复使用,我们可以遍历数组 nums 中的每个元素,并尝试将其加入到总和为 i 的组合中。

  3. 对于每个元素 nums[j],我们可以检查 dp[i - nums[j]],它表示总和为 i - nums[j] 的组合个数。我们可以将 dp[i - nums[j]] 加到 dp[i] 上,表示将 nums[j] 加入到当前组合中。

  4. 重复上述步骤,直到遍历完数组 nums 中的所有元素。

  5. 最终,dp[target] 就是我们要求的答案,表示总和为 target 的组合个数。

代码分析
class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<long long> dp(target + 1, 0);dp[0] = 1;  // 初始化,总和为0的组合个数为1for (int i = 0; i <= target; i++) {for (int j = 0; j < nums.size(); j++) {if (nums[j] <= i && dp[i] < INT_MAX - dp[i - nums[j]]) {dp[i] = dp[i] + dp[i - nums[j]];  // 更新 dp[i]}}}return dp[target];}
};

现在我逐步解释代码的各个部分:

  • 我们定义了一个一维数组 dp,长度为 target + 1,并将所有元素初始化为0。

  • 初始化 dp[0] 为1,因为总和为0的组合只有一种方式,就是什么都不选。

  • 使用两个嵌套的循环,外层循环遍历所有可能的总和 i,内层循环遍历数组 nums 中的所有元素。

  • 在内层循环中,我们检查当前元素 nums[j] 是否小于等于 i,如果是,就说明可以将 nums[j] 加入到总和为 i 的组合中。

  • 如果 dp[i] 的值还没有越界(小于 INT_MAX - dp[i - nums[j]]),则将 dp[i - nums[j]] 的值加到 dp[i] 上,表示将 nums[j] 加入到当前组合中。

  • 最终,返回 dp[target],即总和为 target 的组合个数。

方法二:动态规划二维数组

先给出代码:

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {//dp[j][i]意义是背包容量为i的情况下,最后一个加入的数字是从nums[0]到nums[i]之间的方法的总数vector<vector<long long>> dp(nums.size(), vector<long long>(target + 1, 0));dp[0][0] = 1;for (int i = 0; i <= target; i++) {for (int j = 0; j < nums.size(); j++) {if (j > 0) {dp[j][i] = dp[j - 1][i];}if (i >= nums[j] && dp[j][i] < INT_MAX - dp[nums.size() - 1][i - nums[j]]) {dp[j][i] += dp[nums.size() - 1][i - nums[j]];}}}return dp[nums.size() - 1][target];}
};
  1. 动态规划思路

这个问题的目标是找出总和为 target 的元素组合的个数。首先,让我们定义一个二维数组 dp,其中 dp[j][i]意义是背包容量为i的情况下,最后一个加入的数字是从nums[0]nums[i]之间的方法的总数。我们的目标是求 dp[nums.size() - 1][target],即使用所有的元素构成和为 target 的排列的个数。

  1. 初始化

首先,我们初始化 dp 数组,将所有元素都初始化为 0。然后我们设置 dp[0][0] = 1,这是因为在前 0 个元素中,构成和为 0 的组合有一种方式,即不选择任何元素。

  1. 填充动态规划数组

接下来,我们使用两个嵌套循环来填充 dp 数组。外层循环 i 表示考虑前 i 个元素,内层循环 j 表示目标和为 j

  • 如果 j < nums[i],意味着当前的元素 nums[i] 太大,不能加入组合中,所以我们将 dp[i][j] 设置为 dp[i-1][j],表示不选择当前元素时的组合数,继承上一行的值。

  • 如果 j >= nums[i],意味着当前的元素 nums[i] 可以加入组合中。我们需要考虑两种情况:

    • 不选择当前元素,即 dp[i][j] = dp[i-1][j]
    • 选择当前元素,即 dp[i][j] += dp[i][j - nums[i]],这里的 dp[i][j - nums[i]] 表示在考虑前 i 个元素,和为 j - nums[i] 的组合数。

最终,dp[nums.size() - 1][target] 就代表了使用所有元素构成和为 target 的组合的个数。

  1. 返回结果

最后,我们返回 dp[nums.size() - 1][target] 即可得到答案。

相关文章:

LeetCode377. 组合总和 Ⅳ

377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一&#xff1a;完全背包一维数组动态规划思路代码分析 方法二&#xff1a;动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums &#xff0…...

QT将数据写入文件,日志记录

项目场景&#xff1a; 在QT应用中&#xff0c;有时候需要将错误信息记录在log文件里面&#xff0c;或者需要将数据输出到文件中进行比对查看使用。 创建log文件&#xff0c;如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...

vue2与vue3的使用区别与组件通信

1. 脚手架创建项目的区别&#xff1a; vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...

亚信科技与中国信通院达成全方位、跨领域战略合作

9月11日&#xff0c;亚信科技&#xff08;中国&#xff09;有限公司「简称&#xff1a;亚信科技」与中国信息通信研究院「简称&#xff1a;中国信通院」在京达成战略合作&#xff0c;双方将在关键技术研发、产业链协同等方面展开全方位、跨领域、跨行业深度合作&#xff0c;共促…...

华为Linux系统开发工程师面试

在Linux系统开发工程师的面试中&#xff0c;你可能会遇到以下一些问题&#xff1a; 在同一个网站中&#xff0c;当客户访问的时候&#xff0c;会出现有的页面访问的速度快而有的慢&#xff0c;系统和服务完全正常、网络带宽正常&#xff0c;你如何诊断这个问题&#xff1f;你以…...

Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题

Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题 文章目录 Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题现象解决方法 现象 当有多包数据需要连续下发给下位机时&#xff0c;比如下载数据等&#x…...

人工智能:神经细胞模型到神经网络模型

人工智能领域中的重要流派之一是&#xff1a;从神经细胞模型&#xff08;Neural Cell Model&#xff09;到神经网络模型&#xff08;Neural Network Model&#xff09;。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型&#xff0c;它是由麦卡洛克、匹茨合作&#xff0…...

Redisson分布式锁实战

实战来源 此问题基于电商 这周遇见这么一个问题&#xff0c;简略的说一下 由MQ发布了两个消息&#xff0c;一个是订单新增&#xff0c;一个是订单状态变更 由于直接付款之后&#xff0c;这两个消息的发布时间不分先后&#xff0c;可能会造成两种情况&#xff0c;1、订单状态变更…...

JavaScript中循环遍历数组、跳出循环和继续循环

循环遍历数组 上个文章我们简单的介绍for循环&#xff0c;接下来&#xff0c;我们使用for循环去读取数据的数据&#xff0c;之前我们写过这样的一个数组&#xff0c;如下&#xff1a; const ITshareArray ["张三","二愣子","2033-1997","…...

Java——》Synchronized和Lock区别

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用

JDK20 SpringBoot 3.1.0 JdbcTemplate 使用 一.测试数据库 Postgres二.SpringBoot项目1.Pom 依赖2.配置文件3.启动类4.数据源配置类5.实体对象类包装类6.测试用实体对象1.基类2.扩展类 7.测试类 通过 JdbcTemplate 直接执行 SQL 语句&#xff0c;结合源码动态编译即可方便实现…...

CTFhub_SSRF靶场教程

CTFhub SSRF 题目 1. Bypass 1.1 URL Bypass 请求的URL中必须包含http://notfound.ctfhub.com&#xff0c;来尝试利用URL的一些特殊地方绕过这个限制吧 1.利用?绕过限制urlhttps://www.baidu.com?www.xxxx.me 2.利用绕过限制urlhttps://www.baidu.comwww.xxxx.me 3.利用斜…...

【华为OD机试】单词接龙【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等, 则取字典序最小的单词;已经参与接龙…...

如何优雅的实现无侵入性参数校验之spring-boot-starter-validation

在开发过程中&#xff0c;参数校验是一个非常重要的环节。但是&#xff0c;传统的参数校验方法往往需要在代码中手动添加大量的 if-else 语句&#xff0c;这不仅繁琐&#xff0c;而且容易出错。为了解决这个问题&#xff0c;我们可以使用无侵入性参数校验的方式来简化代码并提高…...

企业架构LNMP学习笔记27

Keepalived的配置补充&#xff1a; 脑裂&#xff08;裂脑&#xff09;&#xff1a;vip出现在了多台机器上。网络不通畅&#xff0c;禁用了数据包&#xff0c;主备服务器没法通讯&#xff0c;造成备服务器认为主服务器不可用&#xff0c;绑定VIP&#xff0c;主服务器VIP不会释放…...

品牌策划经理工作内容|工作职责|品牌策划经理做什么?

一位美国作家曾说过“品牌是一系列期望、记忆、故事和关系&#xff0c;他们共同构成了消费者最终原则一个产品或者服务的原因。” 所以&#xff0c;品牌经理这个岗位主要是创造感知价值主张&#xff0c;激发消费者购买这个品牌后带来的感知价值&#xff0c;这种回报的本质相对…...

【设计模式】三、概述分类+单例模式

文章目录 概述设计模式类型 单例模式饿汉式&#xff08;静态常量&#xff09;饿汉式&#xff08;静态代码块&#xff09;懒汉式(线程不安全)懒汉式(线程安全&#xff0c;同步方法)懒汉式(线程安全&#xff0c;同步代码块)双重检查静态内部类枚举单例模式在 JDK 应用的源码分析 …...

手把手教学 Springboot+ftp+下载图片

简单教学&#xff0c;复制即用的Ftp下载图片 引入配置包 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><grou…...

LaaS LLM as a service

LaaS LLM as a service 核心构成GPT 产业链如何进行商业化LLM(Large Language Model) 发展和趋势LLM(Large Language Model) 对于行业公司的分层LLM(Large Language Model) 的机遇和挑战 LaaS LLM as a service 核心构成 计算&#xff1a;算力模型&#xff1a;算法输入&…...

数据结构与算法(一)数组的相关概念和底层java实现

一、前言 从今天开始&#xff0c;笔者也开始从0学习数据结构和算法&#xff0c;但是因为这次学习比较捉急&#xff0c;所以记录的内容并不会过于详细&#xff0c;会从基础和底层代码实现以及力扣相关题目去写相关的文章&#xff0c;对于详细的概念并不会过多讲解 二、数组基础…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...