, , 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)}
sums_x[1].cardinalities = {"1": [0]}
index = 1
sums_x[0].by_index = {(1,1)}
sums_x[0].cardinalities = {"0,1": [1]}
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)}
sums_x[4].cardinalities = {"2": [3], "3": [4], "4": [4]}
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]