377. 组合总和 Ⅳ
题目描述:
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
解题思路:
算法思路:
⼀定要注意,我们的背包问题本质上求的是「组合」数问题,⽽这⼀道题求的是「排列数」问题。
因此我们不能被这道题给迷惑,还是⽤常规的
dp
思想来解决这道题。
1.
状态表⽰:
这道题的状态表⽰就是根据「拆分出相同⼦问题」的⽅式,抽象出来⼀个状态表⽰:
当我们在求
target
这个数⼀共有⼏种排列⽅式的时候,对于最后⼀个位置,如果我们拿出数组
中的⼀个数
x
,接下来就是去找
target - x
⼀共有多少种排列⽅式。
因此我们可以抽象出来⼀个状态表⽰:
dp[i]
表⽰:总和为
i
的时候,⼀共有多少种排列⽅案。
2.
状态转移⽅程:
对于
dp[i]
,我们根据「最后⼀个位置」划分,我们可以选择数组中的任意⼀个数
nums[j]
,其中
0 <= j <= n - 1
。
当
nums[j] <= target
的时候,此时的排列数等于我们先找到
target - nums[j]
的⽅
案数,然后在每⼀个⽅案后⾯加上⼀个数字
nums[j]
即可。
因为有