Algorithm 等k子集算法
是否有人知道一个好的和有效的算法等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}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-子集,你别无选择,只能这样做 您可以执行一些优化来减少搜索空间 给定一个包含整数值的域
x
,
给定一个正整数目标M,
给定子集的正整数k size
x
中删除可能是总和的一部分的候选值来减少搜索空间正如Jilles De Wit所指出的,如果X包含负数,则可以将X中最小值的绝对值添加到X的每个成员中。这将使所有值回到正数范围-使我上面描述的一些优化再次成为可能。然而,这要求您能够在放大的范围内准确地表示正值。实现这一点的一种方法是在内部使用更广泛的类型(比如long而不是int)来执行子集选择搜索。但是,如果执行此操作,请记住在返回结果时按相同的偏移量缩小结果子集。k是已知的子集数,如果
x
包含负数:难道你不能将x
中的最小值的绝对值赋给x
中的所有数字,并将M乘以每个子集中的项数乘以该值,使所有值都变为正数吗?@jilles de wit:事实上,是的,你可以这样做!当我把答案放在一起时,我没有想到这一点。我会更新这个想法。我想,他的意思是k是子集的数量,而不是子集的大小。排序有什么帮助?@jillesdewit:我认为这个想法只有在每个子集都有相同数量的元素的情况下才会起作用——否则,如果一个子集比另一个子集多5个元素,那么它的总和将多包含500万个“虚单位”比另一个,这意味着重新调整后将减少5米。