【发布时间】:2024-01-13 23:12:01
【问题描述】:
我必须为以下问题找到一个算法:
输入是自然数的两个数 S 和 k 以及一组未排序的 n 对不同的数。
在 O(n) 中决定是否有 k 个数字的子集总和为
algorithm({x_1, ..., x_n}, k, S):
if exists |{x_i, ..., x_j}| = k and x_i + ... x_j <= S return true
我没有找到时间复杂度为 O(n) 的解决方案。
我得到的结果是 O(kn),因为我们搜索 k 次最小值并且总和是:
algorithm(a={x_1, ..., x_n}, k, S):
sum = 0
for i=1,...,k:
min = a.popFirst()
for i=2,...,len(a):
if(a[i] < min):
t = a[i]
a[i] = min
min = t
sum += min
if sum <= S:
return true
else:
return false
这是在 O(n) 中并返回正确的结果。我怎样才能松开k?
谢谢你的帮助,我真的在这方面苦苦挣扎!
【问题讨论】:
-
子集在原始集中应该是连续的吗?即
i <= j in | { x_i,....x_j } |? -
没有。它只是集合的 k 个“指数”!意思是 x_j 必须是 x_{i + k}
标签: algorithm set time-complexity subset-sum