【发布时间】:2013-12-17 05:08:26
【问题描述】:
这是我们算法期末考试的一道题。这是逐字逐句的,因为教授让我们把考试副本带回家。
- (20 分) 令 I = {r1,r2,...,rn} 为 n 个任意正整数的集合,I 中的值为 明显。 I 没有按任何排序顺序给出。假设我们要找到 I 的子集 I',使得 I' 中所有元素的总和正好是 100*ceil(n ^.5)(I 的每个元素在I' 中最多出现一次)。提出一个 O(n) 时间的算法来解决这个问题。
据我所知,这基本上是背包问题的一个特例,也就是所谓的子集和问题......这两个问题都在 NP 中,理论上不可能在线性时间内解决?
那么……这是一个诡计的问题吗?
This SO post 基本上解释说,如果权重是有界的,则可以进行伪多项式(线性)时间近似,但在考试问题中,权重不受限制,无论哪种方式,考虑到考试的整体难度我'如果教授希望我们知道/想出一个晦涩的动态优化算法,我会感到震惊。
【问题讨论】:
-
权重确实是有界的,大于
100*ceil(sqrt(n))的权重可以忽略。所以你可以使用你链接到的算法。 -
当没有解决方案时(例如
I={1,2,3,4}),应该如何响应? (a) “无解” (b) “最近的解是……” (c) 在 O(n) 中不收敛。
标签: algorithm time-complexity subset-sum