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

leetcode动态规划(十七)-组合总和IV

题目

377.组合总和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

思路

从题目给的例子可以看出来每个元素可以取无数次,本题就是完全背包问题

题目中:顺序不同的序列被视作不同的组合,即说明求的是排列,序列不同算不同的组合

动规五步曲

1.确定dp的定义

dp[j]表示背包容量为target的背包装满后有dp[j]种方法

2.确定递推公式

dp[j](考虑nums[i])可以由 dp[j - nums[i]](不考虑nums[i]) 推导出来。

因为只要得到nums[j],排列个数dp[i - nums[j]],就是dp[i]的一部分。

递推公式为dp[j] +=dp[j-nums[i]]

3.初始化

初始化dp[0] = 1,要不为0的话后面就全部都是0了,相加也没有用了,是根据力扣平台的测试用例推测出来的,dp[0]=1没有实际意义,纯粹就是为了递推公式

4.确定递推顺序

因为是求排列,所以要先遍历背包,再遍历物品

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

5.打印dp数组

代码 

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        if min(nums)>target:
            return 0
        dp = [0]*(target+1)
        dp[0] = 1
        for j in range(1,target+1):
            for i in range(len(nums)):
                if j >= nums[i]:#这里需要做判断,如果物品重量大于背包容量,就直接跳过本次累加
                    dp[j] += dp[j-nums[i]]
        return dp[-1]


http://www.kler.cn/news/366706.html

相关文章:

  • UI管理器的使用
  • 知识图谱解码:AI 如何构建知识网络
  • 【linux】服务器Ubuntu20.04安装cuda11.8教程
  • 计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法
  • Lucas带你手撕机器学习——套索回归
  • 修改huggingface的缓存目录以及镜像源
  • Python小游戏9——天天酷跑
  • Laravel使用 Swagger
  • 超详细Redis安装配置【包成功的】
  • 系统架构设计师 软件架构的定义与生命周期
  • week08 zookeeper多种安装与pandas数据变换操作-new
  • UE5学习笔记26-添加游戏热身时间,比赛时间,重新开始比赛
  • 【jvm】所有的线程都共享堆吗
  • 【mysql进阶】4-7. 通用表空间
  • 理解 python 类
  • 某ai gpt的bug
  • go的web服务器框架
  • 南京林业大学生态学博士在1区top期刊揭示人工林发育促进土壤团聚体的形成与稳定:对土壤碳氮固存的启示
  • 多端项目开发全流程详解 - 从需求分析到多端部署
  • C语言 | Leetcode C语言题解之第508题斐波那契数
  • 24. Lammps命令学习-系统定义部分总结
  • MySQL-日志
  • qt QWidget详解
  • LeetCode刷题日记之贪心算法(五)
  • Vim 编辑器从入门到入土
  • Ubuntu安装repo