题目链接:

力扣

题目描述:

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

解析:

从nums中找几个元素放到一起,且这些元素满足一定得要求,这样得描述符合背包问题,又因为每个元素可以取任意多次,

所以是完全背包。元素对应物品,和对应容量,排列数量对应价值

dp四部曲:

确定dp数组:dp[j]表示凑成和为j的排列的数量

确定递推公式:dp[j] = dp[j] + dp[j - nums[i]]第一项表示由前i-1个元素决定的排列数量,第而项表示由第i个元素决定的排列数量

初始化dp数组:dp[0] = 1凑成0就是什么也不取,即[]这种排列。同时dp[0]=0也是为了保证后面的推导顺利,要是dp[0]=0了,那么后面的dp就都是0了

确定遍历顺序:由于是求排列数量,所以采用外层顺序遍历容量,内层顺序遍历物品的顺序

代码如下:

lass Solution:def combinationSum4(self, nums: List[int], target: int) -> int:dp = [0] * (target + 1)dp[0] = 1for j in range(target + 1):#先遍历容量for i in range(len(nums)):#再遍历物品if(j >= nums[i]): dp[j] += dp[j - nums[i]]return dp[target]

这里说一下求排列数量得先遍历容量再遍历容物品的原因:

假设dp[0]=1,dp[1]=3。那么先遍历容量再遍历物品的话每个容量都要经过1和3的计算,即会先对取1的情况进行决策(可以取到{1, 3}),再对取3的情况进行决策(可以取到{3, 1})。即dp[4]中对于1和3有{1, 3}和{3, 1}2种情况.

再说一下求组合数量得先遍历物品再遍历容量的原因:

假设dp[0]=1,dp[1]=3。那么先遍历物品再遍历容量的话就只能先取1,再取3,只能取到{1, 3}这个组合,而不能取到{3, 1}这个组合。即dp[4]中对于1和3就只有{1, 3}这种情况

Leetcode每日一题——377.组合总和Ⅳ。完全背包推导。dp数组相关推荐

  1. LeetCode 每日一题 377. 组合总和 Ⅳ

    377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 32 ...

  2. 【Leetcode】完全背包问题-377. 组合总和 Ⅳ

    [Leetcode]完全背包问题-377. 组合总和 Ⅳ 题目 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素 ...

  3. 模拟卷Leetcode【普通】377. 组合总和 Ⅳ

    377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 32 ...

  4. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  5. Leetcode 每日一题 40 组合2

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...

  6. Leetcode每日一题:992.sort-array-by-parity-ii(按奇偶排序数组Ⅱ)

    思路: 法1:建立一个与原数组同大小的数组res,两次遍历A,偶数放入res的偶下标,奇数放入奇下标: 法2:双指针: 法3:双端队列,遍历A,计数插入前端,偶数插入尾端,然后双指针(1首1尾)对队列 ...

  7. Leetcode每日一题:941.valid-mountain-array(有效的山脉数组)

    思路:先遍历一遍数组,找到最大值max以及最大值索引max_index,然后从此处设立两个指针left和right,一个向左遍历,一个向右遍历,max左右两边应该都是递减的: class Soluti ...

  8. Leetcode每日一题:剑指 Offer 04.(二维数组中的查找)

    思路:有序+查找元素,第一想到的就是二分法,所以我对每行采用二分法,每行的复杂度为O(m),那么总的复杂度就是O(nlogm):看题解从右上角开始,这个数比目标值大,就往左移一列,比目标值小,就往下移 ...

  9. Leetcode每日一题:167.two-sum-ii-input-array-is-sorted(两数之和Ⅱ-输入有序数组)

    解题思路:双指针 l 和 r,分别指向头和尾,对于这个有序数组,如果number[l] + number[r] 比 target大,那么说明选择的r对应元素偏大,将指针 r 左移:如果小于target ...

最新文章

  1. 实验室管理好助手——Bio-lab
  2. 【并发编程】Atomic与CAS
  3. 记录一个ansible高级用法与shell结合
  4. 为什么`malloc`出来的内存也能当成对象正常使用
  5. Docker镜像构成和定制
  6. oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
  7. 20世纪物理学巨人、诺奖得主菲利普安德森逝世,享年96岁
  8. mysql 钩子_面试官: 什么是 Hook (钩子) 线程以及应用场景?
  9. vue cli3--创建通用模版
  10. Codeforces 490F Treeland Tour(离散化 + 线段树合并)
  11. Zblog模板调用标签情况说明
  12. 用场景应用™玩转#冰桶挑战#
  13. python通讯录管理系统
  14. 09.mtk背光流程
  15. 既然彼此不能相濡以沫, 那就相忘于江湖吧.
  16. 翡翠手链的起源和发展历史
  17. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没...
  18. 富贵不压重发_俗语“贵人不顶重发”,重发是啥意思?为什么这样说?
  19. 日本口音英语发音规则
  20. 数学运算符号的英文表达

热门文章

  1. QQ圈子,是在这里在一起,还是在那时在一起?
  2. 波特(Baud)与比特(bit)换算详解
  3. HihoCoder - 1082 然而沼跃鱼早就看穿了一切
  4. 【学习小记】狄利克雷卷积+杜教筛
  5. 关于AES:加密方式,让你的APK无懈可击,android性能优化和内存优化面试
  6. vue 请求后台数据
  7. tlc5620输出三角波流程图_单片机实践A/D和D/A转换的程序
  8. 佘其炯:关于97工程的思考
  9. C语言学习笔记(九)
  10. 组装台式计算机的流程,如何组装电脑?组装电脑的操作流程!