lintcode练习 - 89. K数之和

版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/82532371

89. K数之和

给定 n 个不同的正整数,整数 kk <= n)以及一个目标数字 target。 
在这 n 个数里面找出 k 个数,使得这 k 个数的和等于目标数字,求问有多少种方案?

样例

给出 [1,2,3,4],k=2, target=5[1,4] 和 [2,3] 是 2 个符合要求的方案,返回 2

class Solution:
    """
    @param A: An integer array
    @param k: A positive integer (k <= length(A))
    @param target: An integer
    @return: An integer
    """
    '''
    #TLE
    def kSum(self, A, k, target):
        # write your code here
        #相当于找数组中K个数的组合,然后判断这些组合是否满足要求
        self.res = []
        self.helper(A, k, target, 0, len(A)-k+1, [])
        return len(self.res)
        
    def helper(self, A, k, target, start, end, nums):
        if len(nums) + 1 == k:
            for i in range(start, len(A)):
                if sum(nums + [A[i]]) == target:
                    self.res.append(nums + [A[i]])
            return
        
        for i in range(start, end):
            self.helper(A, k, target, i+1, end+1, nums+[A[i]])
    '''
    
    def kSum(self, A, k, target):
        n = len(A)
        dp = [[0] * (target + 1) for _ in range(k + 1)]
        dp[0][0] = 1

        for i in range(n):
            for j in range(min(i + 1, k), 0, -1):
                for t in range(A[i], target + 1):
                    dp[j][t] += dp[j - 1][t - A[i]]
        return dp[k][target]
                        
        

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/82532371