给定一个候选人名单,我们能否在线性时间内达到目标值?

时间:2017-02-14 22:37:45

标签: algorithm

我最近被问到这个问题。我轰炸它,我会喜欢它的一些帮助。问题是这样的:

您将获得一个数字列表。这些数字都是正整数。所以想象一下这样的事情:

[x_0, x_1, ..., x_{n-2}, x_{n-1}]

所以我们有n个数字。无法保证数字不同。我们也有目标价值。我们称之为XX也是一个正整数。

如果我们可以用以下形式的候选人表达目​​标号True/False,目标是输出一个仅为X的布尔值:

a * x_0 + b * x_1 + ... 

系数的唯一约束是它们也必须是大于或等于0的正整数。

您可以通过对候选人数字进行一些数学计算来获得线性时间的答案。但是,如果我能看到算法更加充实,我很好奇。它不需要编码 - 我可以这样做 - 但我仍然没有完全算法。我想的可能与Sieve of Eratosthenes或甚至Diophantine Equation的方法类似。无论如何,我无法在网上任何地方找到解决方案的简洁文章,并且如果对这个问题进行了更多探讨,那就很好奇。

有没有人有任何想法?再次感谢!真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

使用筛子的解决方案可能如下所示:

创建一个大小为X + 1的布尔数组,其中零设置为true,所有其他值设置为false。然后,对于每个值x i

  • 如果x i 已设置为true,则跳至下一个值(之前的数字组合可用于形成x i 及其所有倍数)。
  • 否则,遍历数组(从0到Xx i )并且对于每个值x k 都是真的,设置x k + x i 为true。
  • 一旦值X设置为true,则返回true。

首先将值从小到大排序可能会增加您跳过某些值的可能性。

示例:

X = 21, x = {4, 6, 8, 10, 11, 13, 15}  

 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21  
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

x = 4:  
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21  
{1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0}

x = 6:  
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21  
{1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}

x = 8: skip

x = 10: skip

x = 11:
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21  
{1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1}
10 + 11 = 21  ->  return true

最坏的情况(没有跳过值,结果是假的)复杂性是N×X,而在最好的情况下(x的第一个值除以X),几乎立即找到一个解。我担心,计算平均案例复杂性并不简单。