【问题标题】:Multiset Multisum Problem: Minimum number of elements required to form two subsets, each summing to k or moreMultiset Multisum Problem:形成两个子集所需的最小元素数,每个子集总和为 k 或更多
【发布时间】:2021-01-11 00:48:42
【问题描述】:

我得到了一个数组(最好是一个多重集),比如 L。现在,我需要告诉从这个集中形成两个子集(多重集)所需的最小元素数(L),这样两个子集的元素之和至少为 k(给定整数)。

我想到的基本想法是:最初,我们有两个空数组/集合。首先,将最大的元素添加到其中一个中。现在,从第二大开始,我将一个元素添加到两个元素中总和最小的子集中,然后继续直到我在这两个中得到至少 k 的总和。这个解决方案在许多测试用例中都有效,但后来我发现了一个反例,证明这个解决方案是不正确的。反例是: 取 L=[1, 2, 4, 5, 6, 7, 8] 和 k=16。

我知道这个问题在某种程度上是子集和问题的修改(更好地说,高级)版本,但不知道如何做到这一点。有人可以帮忙吗?

【问题讨论】:

    标签: algorithm subset-sum


    【解决方案1】:

    很明显,我们希望从 L 的最大元素构建两个子集,因此让我们假设 L 是按降序排序的。

    那么问题就变成了找到最小的 n 使得 L[0:n] 可以被分成两个值 k 或更多的子集。

    这相当于找到最小的 n 使得 S=L[0:n] 可以被拆分为 k 和 sum(S)-k 之间的单个值子集(因为另一个子集将自动具有值 k 或更多,如果这是真的)。​​

    因此,您可以运行标准的子集求和算法,以递减的大小插入 L 的元素,并在每一步检查在 k 到 sum(S)-k 范围内是否有任何解。

    【讨论】:

    • 我没有理解您的解决方案还是您错过了我的意思?好的,无论写的是正确的,它都会告诉我这样的 n 是否存在。通过修改子集总和算法,我还可以找到所需的元素数量,例如总和在 k amd sum(S)-k 之间,但是我如何找到所需的 最小 元素数量其他满足给定属性的集合?
    • 哦,其实我没看懂你的解决方案。现在我知道了。谢谢@Peter
    • 所以,实际上,这个解决方案是可以的,但它不适用于较大的 n 和 k 值。还有比这更好的吗?
    • 你的 n 和 k 有多大?这个解决方案应该是 O(n.k)
    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 2011-11-14
    • 1970-01-01
    • 2021-06-04
    • 2020-08-26
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多