Combination Sum IV

medium array dp

Problem

Given an array of distinct positive integers and a target, return the number of ordered tuples whose values sum to target. You may reuse each value any number of times.

Inputnums = [1, 2, 3], target = 4
Output7
dp[0]=1; for t=1..target, dp[t] = Σ dp[t − num] over nums ≤ t.

def combination_sum4(nums, target):
    dp = [0] * (target + 1)
    dp[0] = 1
    for t in range(1, target + 1):
        for num in nums:
            if num <= t:
                dp[t] += dp[t - num]
    return dp[target]
function combinationSum4(nums, target) {
  const dp = new Array(target + 1).fill(0);
  dp[0] = 1;
  for (let t = 1; t <= target; t++) {
    for (const num of nums) {
      if (num <= t) dp[t] += dp[t - num];
    }
  }
  return dp[target];
}
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1;
        for (int t = 1; t <= target; t++)
            for (int num : nums)
                if (num <= t) dp[t] += dp[t - num];
        return dp[target];
    }
}
int combinationSum4(vector<int>& nums, int target) {
    vector<unsigned int> dp(target + 1, 0);
    dp[0] = 1;
    for (int t = 1; t <= target; t++)
        for (int num : nums)
            if (num <= t) dp[t] += dp[t - num];
    return dp[target];
}
Time: O(target · |nums|) Space: O(target)