http://projecteuler.net/index.php?section=problems&id=109
最後を除いて、重複を避けるためにすべてのポイントを並べて前から順に取っていきます。
doubles = range(2, 42, 2) + [ 50 ] points = range(1, 21) + range(3, 63, 3) + [ 25 ] + doubles def gen_scores(n, k0 = 0): if n == 1: for pt in doubles: yield pt else: for k in xrange(k0, len(points)): pt0 = points[k] for pt in gen_scores(n - 1, k): yield pt0 + pt N = 100 print sum(1 for n in range(1, 4) for pt in gen_scores(n) if pt < N)