输入: 一个由N个正数和一个值为X的数组,其中N相对于X较小。
输出: 子数组,其所有数字之和等于Y > X,且没有其他子数组的数字之和大于X但小于Y。
输出: 子数组,其所有数字之和等于Y > X,且没有其他子数组的数字之和大于X但小于Y。
这个问题是否有多项式解法?如果有,你能呈现出来吗?
这个问题是否有多项式解法?如果有,你能呈现出来吗?
让A
成为我们的数组。这是一个O(X*N)
算法:
initialize set S = {0}
initialize map<int, int> parent
best_sum = inf
best_parent = -1
for a in A
Sn = {}
for s in S
t = s + a
if t > X and t < best_sum
best_sum = t
best_parent = s
end if
if t <= X
Sn.add(t)
parent[t] = s
end if
end for
S = S unite with Sn
end for
Subarray = {best_sum - best_parent}
t = best_parent
while t in parent.keys()
Subarray.add(t-parent[t])
t = parent[t]
end while
print Subarray
X
的和。对于数组A
中的每个元素a
,您可以选择参与或不参与该和。在更新步骤中,S = S unite with Sn
,其中S
表示a
不参与的所有和,而Sn
表示a
参与的所有和。S
表示为布尔数组,如果该项在集合中,则设置为true。请注意,此布尔数组的长度最多为X
。O(X*N)
,内存使用量为O(X)
。p
是什么?我以为它和parent
一样,但当我尝试打印元素时,它不起作用。然而,您的算法确实给出了正确的best_sum
(通过蛮力验证)。 - Jeff Irwinp
应该是 parent
。应该没问题。我会尝试测试一下。 - sve
O(X*Y)
可以接受吗? - sve