📜  组合 sum iv leetcode - C++ (1)

📅  最后修改于: 2023-12-03 15:41:14.788000             🧑  作者: Mango

组合 Sum IV - Leetcode

问题描述

给定一个整数数组 nums 和一个目标值 target,求该数组中所有和为 target 的组合数。

注意:一个数可以使用多次。

示例

输入: 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

解决方案
动态规划(Dynamic Programming)

定义一个一维数组 $dp$,其中 $dp[i]$ 表示目标值为 $i$ 时,数组 nums 中所有组合的个数。那么数组 $dp$ 的长度应该是 $target + 1$,因为我们需要统计从 $0$ 到目标值所有情况的个数。

考虑如何更新 dp 数组:遍历数组 nums 中的每个数字,对于数字 $num$,更新 $dp$ 数组中的所有 $dp[i+num] (i+num≤target)$。如果 $i=0$,也就是目标值为 $num$,那么这是一种有效情况,我们需要将 $dp[num]$ 增加 $1$。

最终得到的 $dp$ 数组的最后一个位置即为所有组合的个数。

C++ 代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<unsigned int> dp(target + 1, 0);
        dp[0] = 1;
        for (int i = 0; i < target; i++) {
            if (dp[i] == 0) {
                continue;
            }
            for (const auto& num : nums) {
                if (i + num <= target) {
                    dp[i + num] += dp[i];
                }
            }
        }
        return dp[target];
    }
};
复杂度分析
  • 时间复杂度:O(TN),其中 T 为目标值,N 为数组 nums 的长度。
  • 空间复杂度:O(T)。
总结

本题是一道经典动态规划问题,需要多项思考才能解决。同时,本题可以看出,动态规划的两个必要条件:重叠子问题最优子结构