leetcode-377:组合总和 Ⅳ

简介: leetcode-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:

输入:nums = [9], target = 3
输出:0

解题

方法一:动态规划

参考链接

假设新加的数放在右侧,

比如我们dp[4]中对于112的排序要包含 (1,2,1),(1,1,2),(2,1,1)

举个例子说明一下排序性:

在dp[4]=dp[4-1]+dp[4-2]+dp[4-3]=dp[3]+dp[2]+dp[1];

其中dp[3]=4 为 111,21,12,3

dp[2]=2 为11,2

dp[1]=1 为1

其中211 来源于dp[3]中的21, 我们补个1

121来源于dp[3]中的12,我们补个1

112来源dp[2]中的11,我们补个2

假设我们每次只能把新的数字放在右侧,那么对于容量为3的背包来说,3来源于dp[0],12来源于dp[1],21来源于dp[2]。(蓝色代表原有的数字,红色代表新加入的数字)

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

java

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp=new int[target+1];
        dp[0]=1;
        for(int i=0;i<=target;i++){
            for(int j=0;j<nums.length;j++){
                if(i-nums[j]>=0){
                    dp[i]+=dp[i-nums[j]];
                }
            }    
        }
        return dp[target];
    }
}

总结:

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

如果求01背包问题,容量从末尾开始遍历。
如果求完全背包问题,容量从头开始遍历。


相关文章
|
2月前
Leetcode第40题(组合总和2)
LeetCode第40题“组合总和II”的解题方法,使用了回溯法来找出所有可能的组合,并对重复元素进行了处理。
27 0
|
2月前
【LeetCode 51】216.组合总和III
【LeetCode 51】216.组合总和III
12 1
|
2月前
【LeetCode 53】39.组合总和
【LeetCode 53】39.组合总和
40 0
|
2月前
LeetCode第39题(组合总和)
LeetCode第39题要求找出一个无重复元素整数数组中所有和为给定目标数的不同组合,可以使用回溯法解决。
54 0
|
4月前
|
算法
LeetCode第40题组合总和II
LeetCode第40题"组合总和II"的解题策略,涉及排序、去重和使用标记数组避免重复组合,通过回溯法实现递归组合。
LeetCode第40题组合总和II
|
4月前
|
算法
LeetCode第39题组合总和
LeetCode第39题"组合总和"的解题思路和技巧,采用回溯法通过递归代替多层嵌套循环,有效解决组合问题。
LeetCode第39题组合总和
|
7月前
|
Java
leetcode-40:组合总和 II
leetcode-40:组合总和 II
51 0
|
7月前
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
44 0
|
7月前
|
Java
leetcode-216:组合总和 III
leetcode-216:组合总和 III
38 0
|
机器学习/深度学习 算法 安全
LeetCode - #40 组合总和 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。