code: def three_partition(x):
      
      f = [0] * (1 << len(x))
      for i in range(len(x)):
          for S in range(1 << i):
              f[S | (1 << i)] = f[S] + x[i]
      for A in range(1 << len(x)):
          for B in range(1 << len(x)):
              if A & B == 0 and f[A] == f[B] and 3 * f[A] == f[-1]:
                  return (A, B, ((1 << len(x)) - 1) ^ A ^ B)
      return None
docs: partition a set of integers in 3 parts of same total value
  
      :param x: table of non negative values
      :returns: triplet of the integers encoding the sets, or None otherwise
      :complexity: :math:`O(2^{2n})`