# 377 Combination Sum IV

# Given an integer array with all positive numbers and no duplicates,
# find the number of possible combinations that add up to a positive integer target.
#
# Example:
#
# nums = [1, 2, 3]
# target = 4
#
# The possible combination ways are:
# (1, 1, 1, 1)
# (1, 1, 2)
# (1, 2, 1)
# (1, 3)
# (2, 1, 1)
# (2, 2)
# (3, 1)
#
# Note that different sequences are counted as different combinations.
#
# Therefore the output is 7.
#
# Follow up:
# What if negative numbers are allowed in the given array?
# How does it change the problem?
# What limitation we need to add to the question to allow negative numbers?

class Solution:
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        res = [0] * (target + 1)
        for i in range(1, len(res)):
            for num in nums:
                if num > i:
                    break
                elif num == i:
                    res[i] += 1
                else:
                    res[i] += res[i-num]

        return res[target]

    # https://www.hrwhisper.me/leetcode-combination-sum-iv/
    # dp[i] += dp[i-num]
    def combinationSum4(self, nums, target):
        dp = [1] + [0] * target
        for i in range(1, target+1):
            for num in nums:
                if i >= num:
                    dp[i] += dp[i-num]
        return dp[target]

print(Solution().combinationSum4([1, 2, 3], 4))


[]