Project Euler 109

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)