我最近被问到这个问题。我轰炸它,我会喜欢它的一些帮助。问题是这样的:
您将获得一个数字列表。这些数字都是正整数。所以想象一下这样的事情:
[x_0, x_1, ..., x_{n-2}, x_{n-1}]
所以我们有n
个数字。无法保证数字不同。我们也有目标价值。我们称之为X
。 X
也是一个正整数。
如果我们可以用以下形式的候选人表达目标号True/False
,目标是输出一个仅为X
的布尔值:
a * x_0 + b * x_1 + ...
系数的唯一约束是它们也必须是大于或等于0的正整数。
您可以通过对候选人数字进行一些数学计算来获得线性时间的答案。但是,如果我能看到算法更加充实,我很好奇。它不需要编码 - 我可以这样做 - 但我仍然没有完全算法。我想的可能与Sieve of Eratosthenes或甚至Diophantine Equation的方法类似。无论如何,我无法在网上任何地方找到解决方案的简洁文章,并且如果对这个问题进行了更多探讨,那就很好奇。
有没有人有任何想法?再次感谢!真的很感谢你的帮助!
答案 0 :(得分:1)
使用筛子的解决方案可能如下所示:
创建一个大小为X + 1的布尔数组,其中零设置为true,所有其他值设置为false。然后,对于每个值x i
首先将值从小到大排序可能会增加您跳过某些值的可能性。
示例:
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),几乎立即找到一个解。我担心,计算平均案例复杂性并不简单。