from functools import lru_cache a = [17.76,62.13,26.67] #62.13,17.76,] b = [24.92,5.88,5.04,3.64,3.45,3.36,2.8,2.8,2.52,2.24,2.24,2.24,1.96,1.96,1.8,1.68,1.4,1.4,1.4,1.2,1.2,1.15,1.12,1.12,1.12,1.12,1.12,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.4,0.4,0.4,0.4,0.4,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28] a = [round(i*100) for i in a] b = [round(i*100) for i in b] a.sort() b.sort() print("sum(a):", sum(a)) print("sum(b):", sum(b)) def main(a): for aa in a: print(f"a = { aa } , len(b) = { len(b) }, sum(b) = { sum(b) }") # print(b) findAinB(aa, 0) @lru_cache(maxsize=10240) def findAinB(a1, ib): # print(a1, ib) if ib >= len(b): return False if a1 == sum(b[ib:]): for i in b[ib:]: print('\t', i) b.remove(i) return True b1 = b[ib] if a1 < b1: return False elif a1 == b1: print('\t', b1) b.pop(ib) return True if findAinB(a1, ib+1): return True elif findAinB(a1-b1, ib+1): print('\t', b1) b.pop(ib) return True return False main(a)