Leetcode 377. 组合总和Ⅳ 入门dp C++实现

devtools/2024/10/9 4:40:35/

问题:Leetcode 377. 组合总和Ⅳ

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

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

算法1:

        和爬楼梯一样,定义 dfs ( i ) 表示爬 i 个台阶的方案数。考虑最后一步爬了 x = nums [ j ] 个台阶,那么问题变成爬 i − x 个台阶的方案数,即 dfs ( i − x ) 。所以有

注:如果 nums [ j ] > i 则跳过。

递归入口:dfs ( target ) ,也就是答案。

记忆化搜索来优化:

        如果一个状态(递归入参)是第一次遇到,那么可以在返回前,把状态及其结果记到一个 memo 数组中。如果一个状态不是第一次遇到(memo 中保存的结果不等于 memo 的初始值),那么可以直接返回 memo 中保存的结果。
        注意:memo 数组的初始值一定不能等于要记忆化的值!例如初始值设置为 0,并且要记忆化的 dfs(i) 也等于 0,那就没法判断 0 到底表示第一次遇到这个状态,还是表示之前遇到过了,从而导致记忆化失效。一般把初始值设置为 −1

代码:

class Solution {int dfs(int i,vector<int>&nums,vector<int>&memo){if(i == 0)  return 1;int& res = memo[i];if(res != -1)   return res;res = 0;for(int x : nums)if(x <= i)  res += dfs(i - x,nums,memo);return res;}
public:int combinationSum4(vector<int>& nums, int target) {vector<int> memo(target + 1,-1);return dfs(target,nums,memo);}
};

算法2:

我们可以去掉递归中的「递」,只保留「归」的部分,即自底向上计算。

        具体来说,dp [ i ] 的定义和 dfs ( i ) 的定义是一样的,都表示表示爬 i 个台阶的方案数。相应的递推式(状态转移方程)也和 dfs 一样:

注:如果 nums [ j ] > i 则跳过。答案为 dp [ target ] ,翻译自递归入口 dfs ( target ) 

代码:

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned> dp(target + 1);dp[0] = 1;for(int i = 1;i <= target;i++)for(int x:nums)if(x <= i)  dp[i] += dp[i - x];return dp[target];}
};


http://www.ppmy.cn/devtools/123194.html

相关文章

docker compose入门1—概念介绍

Docker Compose 是 Docker 的一个工具&#xff0c;专门用于定义和运行多容器 Docker 应用程序。它通过使用一个配置文件&#xff08;通常是 docker-compose.yml&#xff09;来简化管理多个容器的流程&#xff0c;尤其适用于开发、测试和轻量级的生产环境。Compose 工具可以帮助…

Spring Boot:打造下一代医院管理系统

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

这玩意儿表面看上去挺牛逼&#xff0c;但其实背后的逻辑和套路&#xff0c;在咱们开发里见过的那些招数&#xff0c;都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍&#xff0c;让大家功力猛增&#xff0c;吊打面试官。 1. 消息存储&#xff1a;巧妙利用顺序写 先说…

【Git原理与使用】远程操作标签管理

远程操作&&标签管理 1.理解分布式版本控制系统2.新建远程仓库3.克隆远程仓库4.向远程仓库推送5.拉取远程仓库6.配置 Git7.配置命令别名8.标签管理8.1创建标签8.2操作标签 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496;…

算法知识点————贪心

贪心&#xff1a;只考虑局部最优解&#xff0c;不考虑全部最优解。有时候得不到最优解。 DP&#xff1a;考虑全局最优解。DP的特点&#xff1a;无后效性&#xff08;正在求解的时候不关心前面的解是怎么求的&#xff09;&#xff1b; 二者都是在求最优解的&#xff0c;都有最优…

SpringBoot中,接口签名,通用方案,以确保接口的安全性

1. 为什么需要接口签名&#xff1f; 接口签名目的&#xff1a;防止第三方伪造请求。请求伪造&#xff1a;未经授权的第三方构造合法用户的请求来执行不希望的操作。转账接口示例&#xff1a;展示了如果接口没有安全措施&#xff0c;第三方可以轻易伪造请求&#xff0c;例如将资…

springboot自动配置

自动配置的核心就在SpringBootApplication注解上&#xff0c;SpringBootApplication这个注解 底层包含了3个注解&#xff0c;分别是&#xff1a; SpringBootConfiguration ComponentScan EnableAutoConfiguration EnableAutoConfiguration这个注解才是自动配置的核心,它 封…

Android2024.2.1升级错误

提示 Gradle 版本不兼容&#xff0c;升级后就报错了 。 1.gradle安装包镜像 //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip //镜像 2. Build报错&#xff1a…