最大子序列总和

时间:2019-10-28 16:21:30

标签: algorithm data-structures knapsack-problem

给出一个整数数组和一个阈值,确定小于或等于阈值的该数组的任何子序列的最大和。对于最多15个元素,array[i] >= 2*array[j]array[j] >=2*array[i]其中j!=i

threshold最多可以为10 ^ 17,数组的长度可以最多为60,而array[i]可以最多为10^16

threshold太高,因此我们无法通过常规背包方法解决。我尝试将其分为三个部分,然后通过回溯通过蛮力获得可能的和的列表,然后合并三个列表以查找结果。但我认为可能会有更理想的方法。

1 个答案:

答案 0 :(得分:1)

此问题已经精心设置,因此所有常规方法都将耗尽空间。您必须使用提示。

第1步,对降序排列的数组大小进行排序,然后将其分成最多15个“古怪的”和一串元素,例如b1 >= 2*b2b2 >= 2*b3等。

您可以这样做:将最大的链条放入链中,然后将怪异的链条粘贴到怪异的阵列中,直到找到一半大小,将其添加到链中,再将怪异的链条粘贴到怪异的阵列中,依此类推。

现在,对于怪异的子集中的多达32768个子集中的每个子集,尝试找出其余的哪个子集最接近您。但是,您可以使用以下观察。对于您可以选择包含的任何元素,要么太大而不能包含,要么必须包含。 (因为如果您不包括它,那么所有其余部分加在一起就会得出一个较小的数字。)这使您最多可以考虑45个决策点。

换句话说

for each subset of weird ones:
    for each element of the chain
        If we can add this element:
            Add it to the set we are looking at
    if sum(this set) is best so far, improve our max
return the best found.
相关问题