首页 > 其他分享 >【每日一题】组合总和 Ⅳ

【每日一题】组合总和 Ⅳ

时间:2024-04-23 21:59:31浏览次数:23  
标签:target 组合 nums 每日 num dp 总和

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:

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

这题一开始还试图用之前递归的方法做,但发现这边需要考虑不同顺序。用动态规划递推来做会比较简洁。

class Solution(object):
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        dp = [0] * (target + 1) # dp[i]表示和为i的不同组合数,初始化为0
        dp[0] = 1 # 总和为0的组合方式只有一种,即空集
        
        for i in range(1, target + 1): 
            for num in nums:
                if i < num:
                    break
                dp[i] += dp[i - num] # 所有和为i-num的组合加上当前元素可以形成和为i的新组合

        return dp[target]

代码虽然短,但对于很久没写dp的人来说还是需要理解一会的。。动态规划通过构建一个解决方案的部分问题来解决整个问题,通常涉及填充一个或多个DP表(在这个问题中,是一个一维数组)。对于这个特定问题,DP数组的每个位置 i 代表了组成和为 i 的不同组合数。

初始化

我们初始化 dp[0] = 1。这意味着,总和为0的组合方式只有一种,即不选择任何数字(空集合)。这是动态规划的基础。

递推关系

对于每个可能的 i(从1到 target),我们考虑所有可能的 nums 中的数字 num,如果当前数字 num 小于或等于 i,那么 num 可以成为一个潜在的组合部分。

我们的更新规则是 dp[i] += dp[i - num],它基于这样的逻辑:

  • 如果你已经知道了组成和为 i - num 的所有可能的组合数(存储在 dp[i - num] 中),那么每一种组合都可以通过添加 num 来形成一个新的和为 i 的组合。
  • 因此,你可以将这些新增的组合数加到 dp[i] 上。

标签:target,组合,nums,每日,num,dp,总和
From: https://www.cnblogs.com/Aikoin/p/18153830

相关文章

  • 固定组合字母的象形含义
    目录ain自己tr、str、dr、br拽,拖,抽,分开wr拧fl飞,流th伸出,指向st停,站shs表发出、sh表射出ch=c抓住、切分、掌握sp发出,散开pl平整的,平的sw蜿蜒的水、摇摆,摇动sl展开,滑,猛然用力英语单词由26字母构成,26个字母都有各自的意义,同样,某些固定的字母组合也有着固定的意思,透......
  • 推荐蓝牙对讲机内部PA+SW组合电路-CB5337+CBS8112
    CB5337是完整的2.4GHz802.11axWLANRF前端模块(FEM)。包含一个2.4GHz单刀双投(SPDT)发射/接收(T/R)开关,一个2.4GHz低噪声放大器(LNA),以及一个应用于大功率802.11ax2.4GHz功率放大器(PA),非标最高可提供33dbm发射增益和14dbm接收增益;CB5337提供了完整的2.4GHzWLAN射频解决方案,从......
  • 【每日一题】组合总和 III
    216.组合总和III找出所有相加之和为 n的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次 返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例1:输入:k=3,n=7输出:[[1,2,4]]解释:1+2+4......
  • 组合模式
     1.组合模式介绍在解决组织结构这种具有层级关系的结构中,如果使用传统的继承,不能很好的实现管理的操作,比如学院,系的添加,删除,遍历等;所有可以使用组合模式把它们都看成组织结构,没有继承关系,而是一个树形结构。 2.实现publicabstractclassOrgComponent......
  • 组合恒等式
    最基础的就不说了1\[\sum_{i=0}^n(C_n^i)^2=C_{2n}^n\]证明:\(\sum_{i=0}^n(C_n^i)^2=\sum_{i=0}^nC_n^i\cdotC_n^i=\sum_{i=0}^nC_n^i\cdotC_n^{n-i}=C_{2n}^n\)2\[\sum_{i=0}^n(-1)^iC_n^i=[n=0]\]证明:由二项式定理,\(((-1)+1)^n=\sum_{i=0}^nC_n^i\cdot1^{n-i}\c......
  • 重复组合理论与公式
    从n个球当中,取出k个球,k个球允许重复出现,问有几种可能。解答:假设现在有编号的n个球,每一个编号的球有个,那么会有等式:,现在问题就转化为该等式一共有多少解?这里使用间隔法,即使用(n-1)个分隔符分隔得到n个空间,使得每一个空间之和为k.假设这里一共有5个球,取3次,那么需要4个分隔符去......
  • 2024.04.19每日收获之链表与逻辑操作
    今日处理工作时遇到了一个问题,操作非连发按键时也会唤醒机器,但不会有连发动作,查看代码了解到也是历史遗留问题。它采用掩码形式,将多个按键键值或运算到一起,最后在与收到的按键值与运算来查看该按键是否可以连发,这样有一个弊端,即多个按键的按键值占用多个位,会导致非连发按键的键值......
  • 2024.04.18每日收获之联合体结构体内存分配
    今日学习组内前辈留下的代码,数码管动态扫描显示,发现前辈们用的是联合体定义扫描引脚,如:typedefunion{unsignedchara[2];typedefstruct{unsignedchardata0;unsignedchardata1;}data;}seg;此时数组a[2]和结构体里的data0和data1共用地址空间,修改数组或者data会产生相......
  • 每日一模块-collections
    Python的collections模块提供了很多高级的数据结构,使得我们在处理数据时能够更加方便和高效。下面我们将详细讲解collections模块中各个类的功能,并给出相应的样例。导入模块首先,我们需要导入collections模块:importcollections2.CounterCounter是一个字典子类,用于计数可哈......
  • 4月7日每日总结
    SpringBoot框架应用与部署第三天总结今天我学习了如何将SpringBoot应用部署到生产环境中,并进行了一些应用优化和监控方面的学习。首先,我了解了常见的SpringBoot应用部署方式,包括传统的WAR部署和现代的JAR部署,以及它们各自的优缺点。我还学习了如何使用SpringBootActuator来......