fork download
  1.  
  2. def generate_subsets(n, m):
  3. subsets = set()
  4. subsets.add( (0, 0, frozenset()) )
  5. desired_total = (1 + n*m) * n / 2
  6.  
  7. for number in xrange(1, n*m + 1):
  8. new_subsets = subsets.copy()
  9. for size, total, numbers in subsets:
  10. new_size = size + 1
  11. if new_size > n:
  12. continue
  13. new_total = total + number
  14. if new_total > desired_total:
  15. continue
  16. new_numbers = numbers | frozenset( [number] )
  17. new_subsets.add( (new_size, new_total, new_numbers) )
  18. subsets = new_subsets
  19.  
  20. return [ subset for (size, total, subset) in subsets
  21. if size == n and total == desired_total ]
  22.  
  23. def print_covers(subsets, selected_subsets, not_used_numbers):
  24. for subset_index, subset in enumerate(subsets):
  25. if not subset <= not_used_numbers:
  26. continue
  27. new_not_used_numbers = not_used_numbers - subset
  28. new_selected_subsets = selected_subsets + [ subset ]
  29. if new_not_used_numbers:
  30. new_subsets = subsets[subset_index:]
  31. print_covers(new_subsets, new_selected_subsets, new_not_used_numbers)
  32. else:
  33. print ' '.join(map(lambda s: "{%s}" % (", ".join(map(str, s))), new_selected_subsets))
  34.  
  35. n = 3
  36. m = 3
  37.  
  38. subsets = generate_subsets(n, m)
  39. print_covers( subsets, [], frozenset(range(1, m*n + 1)) )
  40.  
Success #stdin #stdout 0.08s 10896KB
stdin
Standard input is empty
stdout
{8, 3, 4} {2, 6, 7} {1, 5, 9}
{3, 5, 7} {9, 2, 4} {8, 1, 6}