问题描述
给出数组形式的未排序的(多)整数集,找到其总和大于或等于const整数x的最小基数子集。
例如:-我们的集合是{4 5 8 10 10}且x = 15,所以总和> = x的最小基数子集是{5 10}
是否存在多项式时间算法来解决此问题?可以将子集总和的优化实例简化为该问题吗?
此问题与以下问题有关,但与以下问题不同:Given a list of n integers,find the minimum subset sum greater than X,作者要求一个总和最接近x的子集,这里我们希望任何> = x但子集个数最少的子集元素
解决方法
有没有多项式时间算法来解决这个问题?
是的。实际上,蛮力会为您带来理想的结果。
- 对列表进行排序: O(n log n)
- 从最大值的末尾开始(两端取决于您的排序方式(即升序或降序)),然后添加值直到达到目标: O(n)
总的来说,该算法具有 O(n log n) 的复杂度,存在于多项式时间内。
可能有更好的算法,但是我不确定。我知道可以在 O(n) 中找到 n th 个最大值时间,但是您必须执行此 m 次,其中 m 表示最小基数。因此,对于这种方法,总体复杂度为 O(m * n) ,仍然是多项式。
无论最小基数的大小如何,第一种方法都会给出 O(n log n) 。第二种方法给出了更好的 best 情况(即基数最终为1,这意味着总体复杂度为 O(n) ),但是最坏的情况是 O(n ^ 2) 。这意味着整个列表都已检查。
能否将子集和的优化实例简化为该问题?
我不这么认为。为总和指定一个特定值与我们所做的有些不同。例如,给定一个列表和两个不同的值,我们将对给定的问题执行完全相同的步骤。对于每个值,唯一的区别是何时超过我们的价值。对于子集和问题,对于每个值,我们可能会有截然不同的结果。