每日OJ题_其它背包问题③_力扣377. 组合总和 Ⅳ(似包非包)

ops/2025/2/27 8:32:54/

目录

力扣377. 组合总和 Ⅳ(似包非包)

解析代码


力扣377. 组合总和 Ⅳ(似包非包)

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

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

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {}
};

解析代码

        需要知道的是背包问题本质上求的是组合数问题,而这一道题虽然题目是组合总数,但求的是排列数问题(排列是无序的,组合是有序的),题目感觉不太严谨。(虽然不能用背包问题解决,但代码类似背包问题,所以称为似包非包)用常规的 dp 思想来解决这道题。

        这道题的状态表示就是根据拆分出相同子问题的方式,抽象出来一个状态表示: 当在求 target 这个数一共有几种排列方式的时候,对于最后一个位置,如果我们拿出数组中的一个数 x ,接下来就是去找 target - x 一共有多少种排列方式。 因此可以抽象出来一个状态表示:

dp[i] 表示:总和为 i 的时候,一共有多少种排列方案

状态转移方程:

        线性 dp 状态转移方程分析方式,一般都是根据最后一步的状况,可以选择数组中的任意一个数 nums[j] ,其中 0 <= j <= n - 1 。

        当 nums[j] <= target 的时候,此时的排列数等于先找到 target - nums[j] 的方案数,然后在每t一个方案后面加上一个数字 nums[j] 即可。 因为有很多个 j 符合情况,因此我们的状态转移方程为: dp[i] += dp[target - nums[j]] ,其中 0 <= j <= n - 1 。

初始化: 和为 0 的时候,可以什么都不选,空集一种方案,因此 dp[0] = 1 。

填表顺序: 根据状态转移方程易得从左往右。

返回值: 根据状态表示,返回 dp[target]。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {// dp[i] 表示:总和为 i 的时候,一共有多少种排列方案vector<double> dp(target + 1, 0); // double防溢出dp[0] = 1;int sz = nums.size();for(int i = 1; i <= target; ++i){for(int j = 0; j < sz; ++j){if(i >= nums[j])dp[i] += dp[i - nums[j]];}}return dp[target];}
};


http://www.ppmy.cn/ops/14951.html

相关文章

矩阵连乘算法

矩阵连乘&#xff1a; #include<iostream> #define inf 0x7fffffff using namespace std; int a[256] { 0 };//存储矩阵的行和列 int m[256][256] { 0 };//存储i到j的最少计算次数 int s[256][256] { 0 };//存储i到j的中转站k void m_print(int i, int j) {if (i …

Flutter pod install 时提示Error installing GoogleUtilitiesComponents

设备&#xff1a;Mac air M3 2024 环境&#xff1a; Mac 14.4.1 Flutter 3.19.5 Android Studio 2023.2 在调用pod install安装插件时&#xff0c;前面成功了几个插件&#xff0c;后面停止在GoogleUtilitiesCompomponents上&#xff0c;等待一会儿后&#xff0c;出现 Err…

Spring Boot 中整合 Redisson 实现分布式锁

添加 Redisson 依赖&#xff1a;在 pom.xml 文件中添加 Redisson 的依赖。 配置 Redis 连接信息&#xff1a;在 application.properties 或 application.yml 文件中配置 Redis 的连接信息。 使用 Redisson 实现分布式锁&#xff1a;在预减库存的地方使用 Redisson 提供的分布…

CAS机制(Compare And Swap)源码解读与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

在组件页面刷新为什么触发不了组件的生命周期销毁钩子

当在前端开发中遇到组件页面刷新时&#xff0c;无法触发组件生命周期的销毁钩子&#xff08;如 Vue 的 beforeDestroy/destroyed 或 React 的 componentWillUnmount&#xff09;&#xff0c;通常有以下几种情况或原因&#xff1a; 页面刷新的本质&#xff1a;当浏览器页面执行刷…

Unity 帧同步游戏解决方案梳理

帧同步游戏解决方案梳理 一、保证所有客户端的计算结果一致二、帧同步手感优化&#xff1a;三、不同步问题总结&#xff1a;四、帧同步优化&#xff1a; 一、保证所有客户端的计算结果一致 保证所有客户端的计算结果一致 1、逻辑与显示分离 逻辑控制显示&#xff0c;而显示的执…

PyTorch 与深度学习:入门指南

引言 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 开发并维护&#xff0c;它在深度学习社区中得到了广泛的应用和认可。本文将介绍 PyTorch 的基本概念、特点以及如何利用 PyTorch 进行深度学习模型的构建与训练。 1. 什么是 PyTorch&#xff1f; PyTorch 是一…

Oracle数据库从入门到精通系列之二十二:在线增大Oracle 19c 数据库重做日志redo log文件大小

Oracle数据库从入门到精通系列之二十二:在线增大Oracle 19c 数据库redo log文件大小 一、登陆数据库二、查询默认重做日志大小三、查询重做日志位置四、增加重做日志组和大小五、再次查询重做日志大小和状态六、将日志文件切换到新添加的重做日志组七、删除inactive状态的重做…