组合总和Ⅳ(LeetCode-377)

简介: 组合总和Ⅳ(LeetCode-377)

3. 组合总和Ⅳ(LeetCode-377)


题目

给你一个由 不同 整数组成的数组 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


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


思路

由示例一最后一行得,题目看似求的组合数,实际上求的是排序数


五部曲


dp[j] 含义


凑成目标正整数为 j jj 的排列个数(使背包容量为 j jj 的背包恰好装满的组合数——不同排序算做不同组合)

递推公式


d p [ j ] + = d p [ j − d p [ n u m s ] ]

数组初始化


dp[0]=1

遍历顺序


先遍历背包,嵌套遍历物品,且物品遍历要正序

如果把遍历 nums(物品)放在外循环,遍历target的作为内循环的话,举⼀个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有 {3,1} 这样的集合,因为nums遍历放在外层,3只能出现在1后面


代码展示

class Solution
{
public:
    int combinationSum4(vector<int> &nums, int target)
    {
        vector<int> dp(target + 1);
        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];
    }
};
目录
相关文章
|
存储 C++
基于Qt的简易文件压缩与解压缩工具设计与实现
基于Qt的简易文件压缩与解压缩工具设计与实现
574 1
|
网络安全 Python
Python:获取ssl证书信息和到期时间
Python:获取ssl证书信息和到期时间
617 0
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
Ubuntu Shell
【Ubuntu系统】三步更新自己的Cmake最新版本
Ubuntu系统中通过三步简单流程更新Cmake到最新版本的具体操作方法,包括卸载旧版本、下载并运行安装脚本以及创建软链接。
3369 1
|
监控 关系型数据库 MySQL
守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)
**守护进程(Daemon Process)详解**:守护进程是后台运行的无终端关联的系统进程,常在启动时启动,提供持续服务,如网络服务、日志记录和定时任务。其特点包括脱离终端、后台运行、持久服务、资源管理和错误处理。创建守护进程涉及重定向文件描述符、创建新会话、改变工作目录等步骤。`ps` 和 `top` 命令用于查看守护进程,前者提供进程快照,后者显示实时资源使用情况。
1205 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的经典电影推荐网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的经典电影推荐网站附带文章源码部署视频讲解等
106 1
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的北京医疗企业固定资产管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的北京医疗企业固定资产管理系统附带文章源码部署视频讲解等
94 0
|
弹性计算 Linux 数据安全/隐私保护
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
39345 3
阿里云服务器ECS远程登录用户名密码查询方法
|
SQL JSON 搜索推荐
ElasticSearch学习笔记(七) 聚合
Elasticsearch 聚合(Aggregation)是 Elasticsearch 中用于处理搜索结果的重要工具之一。它可以帮助我们对搜索结果进行各种数据统计和分析,以便更好地理解搜索结果数据的特征和趋势。
361 0