Algorithm 等k子集算法

Algorithm 等k子集算法,algorithm,subset-sum,Algorithm,Subset Sum,是否有人知道一个好的和有效的算法等k子集算法?最好是C或C++,它们可以处理100元向量,可能具有复杂度和时间估计< /P> 例9元素向量 x={2,4,5,6,8,9,11,13,14} 我需要生成sum=24的所有k=3不相交子集 算法应该检查是否有k个不相交的子集,每个子集的元素之和为24,并按升序(在子集和子集之间)列出它们,或者查看解决方案是否不存在 解决方案 解决方案1:{2814}{4911}{5613} 解决方案2:{2913}{4614}{5811} 谢谢不幸的是。。。如果你想

是否有人知道一个好的和有效的算法等k子集算法?最好是C或C++,它们可以处理100元向量,可能具有复杂度和时间估计< /P> 例9元素向量

x={2,4,5,6,8,9,11,13,14}

我需要生成sum=24的所有k=3不相交子集 算法应该检查是否有k个不相交的子集,每个子集的元素之和为24,并按升序(在子集和子集之间)列出它们,或者查看解决方案是否不存在

解决方案

解决方案1:{2814}{4911}{5613}

解决方案2:{2913}{4614}{5811}


谢谢

不幸的是。。。如果你想生成所有这样的k-子集,你别无选择,只能这样做

您可以执行一些优化来减少搜索空间

给定一个包含整数值的域
x
, 给定一个正整数目标M, 给定子集的正整数k size

  • 当x仅包含正整数,且给定上界M时,从x中删除大于或等于M的所有项。这些项不可能是子集的一部分
  • 类似地,对于k>1,给定的M和包含正整数的x,从x中删除大于M+min0+min1的所有项。。。水貂。本质上,删除所有不可能属于子集的大值,因为即使选择小值,它们的总和也会超过M
  • 您还可以使用偶数/奇数排除原则来缩减搜索空间。例如,如果k是奇数,M是偶数,那么这个和要么包含三个偶数,要么包含两个奇数和一个偶数。您可以使用此信息通过从
    x
    中删除可能是总和的一部分的候选值来减少搜索空间
  • 对向量x进行排序-这允许您快速排除总和中不可能包含的值
  • 当向量x包含负值时,许多优化(奇偶排除除外)不再有用/有效。在这种情况下,您几乎必须进行彻底的搜索


    正如Jilles De Wit所指出的,如果X包含负数,则可以将X中最小值的绝对值添加到X的每个成员中。这将使所有值回到正数范围-使我上面描述的一些优化再次成为可能。然而,这要求您能够在放大的范围内准确地表示正值。实现这一点的一种方法是在内部使用更广泛的类型(比如long而不是int)来执行子集选择搜索。但是,如果执行此操作,请记住在返回结果时按相同的偏移量缩小结果子集。

    k是已知的子集数,如果
    x
    包含负数:难道你不能将
    x
    中的最小值的绝对值赋给
    x
    中的所有数字,并将M乘以每个子集中的项数乘以该值,使所有值都变为正数吗?@jilles de wit:事实上,是的,你可以这样做!当我把答案放在一起时,我没有想到这一点。我会更新这个想法。我想,他的意思是k是子集的数量,而不是子集的大小。排序有什么帮助?@jillesdewit:我认为这个想法只有在每个子集都有相同数量的元素的情况下才会起作用——否则,如果一个子集比另一个子集多5个元素,那么它的总和将多包含500万个“虚单位”比另一个,这意味着重新调整后将减少5米。