这里有可能使我们比user3386109的好主意较低的运营复杂性的方法。对三元组中的每个成员单独进行总计枚举,并为三个枚举组合中的(索引,基数)追踪匹配:对于三元组中的每个成员,x
,y
和z
在(x,y,z)
中迭代一个单独的一维阵列代表总和高达133,索引基数:
# for example, Xs enumeration only
for index, (x,y,z) in triples:
for s in [133 - x ... 0]
if sums_x[s].cardinalities.length > 0:
for cardinality in sums_x[s].cardinalities:
sums_x[s + x].by_index.add((index,cardinality + 1)) # this is a set of (index,cardinality) tuples
sums_x[s + x].cardinalities["cardinality + 1"].push(index) # hash cardinality to indexes
sums_x[x].by_index.add((index,1))
sums_x[x].cardinalities["1"].push(index)
一旦我们迭代三个一维数组上,一个用于三元组的每个成员,我们可以追踪可能的匹配。由于在所有三个枚举中跟踪(总和,基数,索引)的一致匹配的可能性很低,因此很少见。
例如:
(1 2 3),(0 4 1),(1 3 4),(1 1 1),(2 1 0)
index = 0
sums_x[1].by_index = {(0,1)} # (index,cardinality)
sums_x[1].cardinalities = {"1": [0]} # cardinality: indexes
index = 1
sums_x[0].by_index = {(1,1)} # (index,cardinality)
sums_x[0].cardinalities = {"0,1": [1]} # cardinality: indexes
sums_x[1].by_index = {(0,1), (1,2)}
sums_x[1].cardinalities = {"1": [0], "2": [1]}
...
index = 4
sums_x[4].by_index = {(4,3), (4,4)} # (index,cardinality)
sums_x[4].cardinalities = {"2": [3], "3": [4], "4": [4]} # cardinality: indexes
sums_y[4].by_index = {(1,1), (3,2), (4,2), (4,3)}
sums_y[4].cardinalities = {"1": [1], "2": [3,4], "3": [4]}
sums_z[4].by_index = {(1,2), (2,1), (3,2), (4,3), (4,2)}
sums_z[4].cardinalities = {"2": [1,3,4], "1": [2], "3": [4]}
正如我们可以看到,对于本实施例的总和4,有的(索引,基数)只有一个匹配,在所有三个总和结构,(4,3),然后我们可以使用关联的值追溯到:
sums_z[4]: 4,3
=> val 0 => lookup by z sum (4 - 0) and cardinality (3 - 1)
=> sums_z[4].cardinalities[2] yields only one match across: index 3
=> lookup by z sum (4 - 1) and cardinality (2 - 1)
=> sums_z[3].cardinalities[1] yields a match across: index 0
=> possible solution, indexes [4,3,0]
如果存在多个组合,该怎么办? – BlackBear
你的意思是说有两种或两种以上适当比例的组合,其成分总量的重量是相同的?这个问题并没有说明任何问题,所以我假设只会有一个这样的组合。但是,是的,会有不止一种比例适当的组合,但我们正在寻找可能含有最多成分的成分(并且所有成分为1:1:1)。 – drakerc
很有可能会有多种组合导致最好的权重,所以您需要知道是最大化还是最小化答案的第二行。 – user3386109