【发布时间】:2013-02-28 09:38:02
【问题描述】:
给定两个数字列表和一个总计列表(没有任何特定顺序):
a = [1,2,3]
b = [4,5,6]
c = [6,7,8]
如何找到 d where d[k] = (a[i], b[j]) 的所有对集合,以便 c[k] = a[i] + b[j] where 对从 a 和 b 使用而无需替换? (所有列表都可以有重复)
d = [(1,5), (3,4), (2,6)]
d = [(2,4), (1,6), (3,5)]
对于c = [7,7,7]:
d = [(1,6), (2,5), (3,4)]
(1 个答案,因为所有排列本质上都是等价的)
我想使用长度约为 500 的列表来执行此操作,因此天真的匹配/回溯搜索是不可能的。
【问题讨论】:
-
您想要一组对序列,其中集合中的每个序列的总和与序列 c 匹配?此外,在第一个示例中,是否还会包含 [(1,5)、(1,6)、(2,6)] 以及更多此类内容?
-
无替换。我要解决的问题是每个列表都包含学生的分数。我可以访问每个列表和两者的总和,但想知道给定总分,可能的子分数是多少。如果它使问题更容易解决(或增加唯一解决方案的机会),我可以访问这些列表中的 N 个,并且可以在数据库中查询其中任何子集的总计列表。
-
这个问题在维基百科中被描述为Numerical 3-dimensional matching。它是 NP 完全的。
-
第三组是 c 的负数,b = 0。好的,谢谢。
-
啊,在不可忽略的大小数据集上解决一个 NP 完全问题。美好时光。
标签: algorithm matching subset-sum