377. 组合总和 Ⅳ

377. 组合总和 Ⅳ

1.题目描述

给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
377. 组合总和 Ⅳ_第1张图片
进阶:
如果给定的数组中含有负数会怎么样?
问题会产生什么变化?
我们需要在题目中添加什么限制来允许负数的出现?

2.思路(动态规划)

涉及顺序的完全背包问题。
(1)状态定义:dp[i]和为i的组合个数
(2)转移方程:dp[i] = dp[i] + dp[i-nums[j]],考虑当前数字和不考虑当前数字的组合个数之和。
(3)初始化:dp[0] = 1,和为1有一个组合,选择空即可。

3.代码

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

4.复杂度分析

时间复杂度:O(target*n),n为数字长度
空间复杂度:O(target)

你可能感兴趣的:(LeetCode动态规划,数据结构,动态规划,leetcode)