class Solution: 
#time O(2^N) space O(1)
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        nums = [i for i in range(1,10)]
        res = []
        def dfs(start,target,path):
            if target < 0 or len(path) > k:
                return 
            if target == 0 and len(path) == k:
                res.append(path[:])
                return 
            for i in range(start,len(nums)):
                target -= nums[i]
                if target < 0:  # optimization
                    break
                path.append(nums[i])
                dfs(i+1,target,path)
                path.pop()
                target += nums[i]
        dfs(0,n,[])
        return res