这个拼图 - 子集总和?

时间:2012-12-22 19:36:39

标签: algorithm language-agnostic subset-sum

在今天的“卫报”(英国的一家报纸)中,在第43页的克里斯·马斯兰卡的“Pyrgic难题”部分中,给出了以下谜题:

  

三位智者......去 Herrods 去圣诞节购物。 Caspar买了Gold,Melchior买了Frankincense,Balthazar买了一份 the Daily Myrrh 。收银员在这些东西中花费了欧元的数量,并且意味着要添加这三个数字,而是将它们相乘。 ...事情的奇迹是结果完全相同:€65.52。三个总和是什么[我认为他的意思是三个数字]?

我的解释是:找到 a b c ,以便 a + b + c = abc = 65.52(确切地说) a b c 是正十进制数,不超过两位小数。因此, a b c 也必须小于65.52(大约)。

我的方法是:我将找到 a b c 的所有候选集合,其中 a + b + c = 6552和 a b c 是整数来自{1 ... 6550}(为了方便起见,我将所有操作数乘以100)。然后,对于所有候选集,通过将所有操作数除以100然后乘以它们(使用任意精度算术)来满足另一个条件是微不足道的。

我认为这是子集求和问题的一个实例。所以我实现了一个脏(指数时间)算法,找到了一个不同的解决方案:a = 0.52,b = 2,c = 63。

好的,对于子集求和问题有更好的算法,但是你不认为这对普通的卫报读者来说有点遥不可及吗?

在第40页上列出了答案:

  

这很容易,通过反复试验。猜猜52p为每日没药。但乘以0.52大致减半,所以我们需要一个总和约为2;所以试试2 X 63 X 0.52。 Etvoilà。这个答案是独一无二的吗?

嗯,我们知道答案是独一无二的(无论其他排列是否为2,63和0.52)。

我想知道的是:这怎么可能“简单”?我是否正确将拼图描述为子集和问题的一个实例?我是否忽略了可用于简化解决方案的谜题的某些特征?是否有人能够采用类似的“反复试验”方法,如果是这样,他们可以带我通过吗?克里斯马斯兰卡是不是完全不受NP完全问题的影响?

1 个答案:

答案 0 :(得分:3)

不,它不是子集求和问题的实例,因为:

  1. 子集大小限制为3,使其O(n^3)解决最坏情况下的天真穷举搜索(而非指数)
  2. 此处还有其他数据,数字的乘积。
  3. 你实际上没有给出一个集合,一组所有整数只是子集和的子问题,更容易一个。
  4. 这里要理解的重要一点是:如果问题可以通过NP-Hard问题解决 - 它并不意味着它也是NP-Hard,反之亦然 - 如果你有问题,并且你可以用它来解决一些NP-Hard问题(多项式),然后你的问题就是NP-Hard。它被称为polynomial reduction 1


    这种方法很简单,因为您只需要“猜测”(通过迭代所有候选项)a的值,然后您就可以推导出b的可能解决方案, c - (2个变量,两个方程,如果已知a - 并且在每次迭代中 - 它是),因此解是偶数线性的 - 不仅是指数的。

    甚至可以优化使用二进制搜索的变体来获得子线性优化,但我现在无法想到这种优化。


    (1)注意:这是一些直观的解释,而不是正式的定义。