fork download
  1. f=\
  2. lambda n,s:max([next(K:=F(s,n)),next(K,0)])
  3. def F(s,n):
  4. q,V=[(s,[])],[]
  5. while q:
  6. q=sorted(q,key=lambda x:len(x[1]))[::-1];(s,p),*q=q;F=Q=[(s,[],0,0)]
  7. for S,P,C,I in Q:
  8. if C-n:
  9. if I<len(S):Q+=(S[I]+C<=n)*[(S,P+[I],S[I]+C,I+1)]+[(S,P,C,I+1)]
  10. else:U=sorted(p+[[s[k]for k in P]]);Z=U not in V;q+=Z*[([a for i,a in enumerate(s)if~-(i in P)],U)];V+=Z*[U];F=0
  11. if F:yield len(p)
  12.  
  13. import re
  14. s = """
  15. 1, [1] -> 1
  16. 1, [2] -> 0
  17. 2, [1] -> 0
  18. 1, [1, 1] -> 2
  19. 2, [1, 1, 1] -> 1
  20. 3, [1, 1, 2, 2] -> 2
  21. 9, [1, 1, 3, 3, 5, 5, 7] -> 2
  22. 9, [1, 1, 3, 3, 5, 7, 7] -> 1
  23. 8, [1, 1, 2, 3, 4, 6, 6, 6] -> 2
  24. 6, [1, 1, 2, 2, 3, 3, 3, 5, 6, 8] -> 4
  25. 13, [2, 2, 2, 2, 3, 3, 4, 5, 5, 6, 8, 9, 9, 11, 12] -> 5
  26. 22, [1, 1, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 9, 9, 10, 13, 14, 14, 17, 18, 18, 21] -> 10
  27. """
  28. for i in filter(None, s.split('\n')):
  29. a, b, c = map(eval, re.split(',\s(?=\[)|\s\-\>\s',i))
  30. assert f(a,b)==c
  31.  
  32. print('tests passed')
Success #stdin #stdout 0.13s 15520KB
stdin
Standard input is empty
stdout
tests passed