最大子集和小于给定值

时间:2017-01-22 17:22:35

标签: arrays algorithm subset dynamic-programming

给出一个整数数组和一个数字k。问题是找到一个子集,使得和是最大的并且小于给定的数k。 我觉得有一种动态编程方法可以解决这个问题,但我不确定如何有效地解决这个问题。

2 个答案:

答案 0 :(得分:0)

这类问题的简单动态程序都使用相同的基本技巧:对于数组的每个连续前缀,计算其子集和的集合,具体取决于当输入元素有界时,此集合有少于2 ^ n个元素(对于有问题的问题,少于10,000,000而不是2 ^ 1000)。这个特殊问题,在Python中:

def maxsubsetsumlt(array, k):
    sums = {0}
    for elem in array:
        sums.update({sum_ + elem for sum_ in sums})
    return max(sum_ for sum_ in sums if sum_ < k)

答案 1 :(得分:0)

这可以通过使用 Subset Sum algorithm 并稍作修改来完成。不是从最后一个(右下角)单元格返回布尔值,而是搜索值为 true 的第一个单元格,这表明存在总和为该特定 k_i < k 的元素组合。这个 k_i 是你小于 k 的最大和。该算法的最坏情况时间和空间复杂度为 O(nk)。