用回溯法解决目标值组合问题

一、NC238 加起来和为目标值的组合

class Solution:
    def combinationCount(self , target: int, nums: List[int]) -> List[List[int]]:
        # write code here
        ''' 
        #元素不可以重复选取
        def dfs(track,start,target):
            if target==0:
                res.append(track.copy())
                return
            for i in range(start,len(nums)):
                track.append(nums[i])
                dfs(track,start+1,target-nums[i])
                track.pop()
        '''
        #元素可以重复选取
        def dfs(track,start,target):
            if target<0:
                return
            if target==0:
                res.append(track.copy())
                return
            for i in range(start,len(nums)):
                track.append(nums[i])
                #令start=i是为了避免出现例如这种情况:[[1,1,1,1,1],[1,4],[4,1],[5]]
                dfs(track,i,target-nums[i])
                track.pop()
                
        res,track = [], []
        dfs(track,0,target)
        return res                       

二、NC46 加起来和为目标值的组合(二)

class Solution:
    def combinationSum2(self , nums: List[int], target: int) -> List[List[int]]:
        # write code here
        def dfs(track,start,target):
            if target<0:
                return
            if target==0:
                res.append(track.copy())
                return
            for i in range(start,len(nums)):
                if i!=start and nums[i] == nums[i-1]:
                    continue
                track.append(nums[i])
                dfs(track,i+1,target-nums[i])
                track.pop()
                
        res,track = [], []
        nums.sort()
        dfs(track,0,target)
        return res

三、NC232 加起来和为目标值的组合(三)

class Solution:
    def combination(self , k: int, n: int) -> List[List[int]]:
        # write code here
        def dfs(track,start,target):
            if target < 0 or len(track)>k:
                return
            if target == 0 and len(track)==k:
                res.append(track.copy())
                return
            for i in range(start,10):
                track.append(i)
                dfs(track,i+1,target-i)
                track.pop()
        res,track = [], []
        dfs(track,1,n)
        return res

四、NC233 加起来和为目标值的组合(四)

class Solution:
    def combination(self , nums: List[int], target: int) -> int:
        # write code here
        def dfs(track,target):
            if target<0:
                return
            if target==0:
                res.append(track.copy())
                return
            for i in range(len(nums)):
                track.append(nums[i])
                dfs(track,target-nums[i])
                track.pop()
                
        res,track = [], []
        dfs(track,target)
        return len(res)