377. Combination Sum IV

Question

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?

Solution:

  • Method 1: Search dfs TLE
      class Solution {
          private int res = 0;
          public int combinationSum4(int[] nums, int target) {
              dfs(nums, target, 0);
              return res;
          }
          private void dfs(int[] nums, int target, int temp){
              if(temp == target) res++;
              else if(temp < target){
                  for(int i = 0; i < nums.length; i++){
                      dfs(nums, target, temp + nums[i]);
                  }
              }
          }
      }
    
  • Method 1:DP AC 87.93%
      class Solution {
          public int combinationSum4(int[] nums, int target) {
              int[] dp = new int[target + 1];
              dp[0] = 1;
              for(int i = 1; i <= target; i++){
                  for(int num : nums){
                      dp[i] += i - num >= 0 ? dp[i - num]: 0;
                  }
              }
              return dp[target];
          }
      }