lintcode练习 - 89. K数之和

204 篇文章 0 订阅
190 篇文章 5 订阅

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]
                        
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值