程式語言 - LeetCode - C++ - 377. Combination Sum IV



題目:


解答一:

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        vector<unsigned long long> dp(target + 1, 0);

        dp[0] = 1;
        for (int i = 1; i <= target; ++i) {
            for (int num : nums) {
                if (i >= num) {
                    dp[i] += dp[i - num];
                }
            }
        }

        return dp[target];
    }
};

解答二:

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        unordered_map<int, int> memo;

        auto dfs = [&](this auto&& dfs, int target) -> int {
            if (target == 0) {
                return 1;
            }
            if (target < 0) {
                return 0;
            }
            if (memo.count(target)) {
                return memo[target];
            }

            int ans = 0;
            for (int num : nums) {
                ans += dfs(target - num);
            }

            return memo[target] = ans;
        };

        return dfs(target);
    }
};