Problem Statement
Given an array of distinct integers nums and a target integer target, return the number of possible combinations that add up to target. The test cases are generated so that the answer can fit in a 32-bit integer.
Example 1:
Input: nums = [1,2,3], target = 4 Output: 7 Explanation: 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.
Example 2:
Input: nums = [9], target = 3 Output: 0
Constraints:
1 ⇐ nums.length ⇐ 200 1 ⇐ nums[i] ⇐ 1000 All the elements of nums are unique. 1 ⇐ target ⇐ 1000
Solution:
public int backtrack(int index, int[] nums, int target, List<Integer> possAns, int[] dp) {
if (target == 0) {
return 1;
}
if (index == nums.length) {
return 0;
}
if (dp[target] != -1) {
return dp[target];
}
// Initialize count
int count = 0;
// Iterate over each number from the start
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= target) {
possAns.add(nums[i]);
count += backtrack(0, nums, target - nums[i], possAns, dp);
possAns.remove(possAns.size() - 1);
}
}
dp[target] = count;
return dp[target];
}
public int combinationSum4(int[] nums, int target) {
List<Integer> possAns = new ArrayList<>();
int[] dp = new int[target + 1];
Arrays.fill(dp, -1);
return backtrack(0, nums, target, possAns, dp);
}