【发布时间】:2018-05-09 17:44:22
【问题描述】:
我一直在从事一些项目,偶然发现了一个问题,它是多路分区问题的变体。我们可以将问题表述如下:
给定一个由 n 个整数组成的集合 S,以及一个由 k 个和组成的集合 K,求 >k 个 S 的子集,使得第 i 个子集具有 K 的第 i 个元素的和。
这并不严格要求对集合 S 进行分区,因为某些元素可能未被使用。
我的天真尝试是首先遍历 S 的元素,如果该元素与某些总和匹配,则形成一个单元素子集。然后我会按升序对 S 的元素进行排序,并对元素求和,直到它们达到给定的总和(子集总和问题)。但是,这经常失败。
解决方案不必是准确的。问题的性质允许每个总和的误差高达 10%。但是,它必须相当快。为了提供有关输入数据的一些信息,n 预计约为数百万,而 k 预计在 1 到 10000 之间。该算法应该在 10 秒的范围内运行(它将在 Web 界面上使用,用户不应等待超过一两分钟)。
如果我没记错的话,这是一个 NP 完全问题,但我不需要一个精确的解决方案,只是一个粗略的近似。感谢任何帮助,因为我找不到任何接近我需要的东西,除了多路分区问题,这里不能完全使用。
谢谢。
【问题讨论】:
标签: algorithm language-agnostic partitioning