【发布时间】:2011-06-15 04:59:52
【问题描述】:
我一直在努力应对 Greplin 挑战的第 3 级。对于那些不熟悉的人,这里有问题:
您必须找到数组的所有子集,其中最大数字是其余数字的总和。例如,对于以下输入:
(1, 2, 3, 4, 6)
子集是
1 + 2 = 3
1 + 3 = 4
2 + 4 = 6
1 + 2 + 3 = 6
这是您应该列出的数字列表 运行你的代码。密码是 子集的数量。在上述情况下 答案是 4。
3、4、9、14、15、19、28、37、47、50、54、56、59、61、70、73、78、81、92、95、97、99
我能够编写一个解决方案,该解决方案构建了 22 个数字的全部 400 万个组合,然后对它们进行了测试,这将为我提供正确的答案。问题是它需要 40 多分钟才能完成。在网上搜索,似乎有几个人能够编写一个算法来在不到一秒钟的时间内得到答案。任何人都可以用伪代码解释比计算昂贵的蛮力方法更好的方法来解决这个问题吗?快把我逼疯了!
【问题讨论】:
-
您能提供您找到的更快解决方案的链接吗?
-
这不是作业问题,我也不想在 Greplin 找到工作。只是在寻找比我想出的更好的解决方案。
-
好的。无论如何,为了鼓励更有效的答案,我只想补充一点,蛮力方法在集合大小的指数时间内运行,或者更准确地说,Theta(2^n),因为有对于任何 n 个元素的集合,恰好是 2^n 个可能的子集。
-
也许这也应该被标记为组合和算法问题?
标签: algorithm combinatorics computation-theory subset-sum