0

The question is:

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.

def combinationSum4(nums: List[int], target: int) -> int:
    if target == 0:
        return 1
    elif target < 0:
        return 0
    elif len(nums) == 0:
        return 1
    else:
        return combinationSum4(nums[1:], target-nums[0]) + combinationSum4(nums[1:], target)

The output is 7 but I'm getting 6 instead.

cdlane
  • 40,441
  • 5
  • 32
  • 81
josh020
  • 11
  • 3

2 Answers2

1

I'd like to introduce another approach to solve it by recursion, take a look at this:

m_nums = [1, 2, 3]
m_target = 4

def recursive_implementation(nums, target, cnt):
    if target == 0:
        return cnt+1
    else:
        for item in nums:
            if item<=target:
                cnt = recursive_implementation(nums, target-item, cnt)
    return cnt
                    

a = recursive_implementation(m_nums, m_target, 0)
print(a)

output:

7

for sanity check, I tried it also on the input - 1, 2 target: 4 options are:

(1,1,1,1)
(1,1,2)
(1,2,1)
(2,1,1)
(2,2)
# output of the recursion - 5
Yossi Levi
  • 1,258
  • 1
  • 4
  • 7
1

I like @YossiLevi's general approach, but I would avoid his extra argument and simply do:

def combinationSum(numbers, target):
    if target == 0:
        return 1  # base case

    count = 0

    for number in numbers:
        if number <= target:
            count += combinationSum(numbers, target - number)

    return count

print(combinationSum([1, 2, 3], 4))
cdlane
  • 40,441
  • 5
  • 32
  • 81