bearophileh...@lycos.com wrote:
MRAB:
I think I might have cracked it:
...
     print n, sums

Nice.
If you don't want to use dynamic programming, then add a @memoize
decoration before the function, using for example my one:
http://code.activestate.com/recipes/466320/

And you will see an interesting speed increase, even if you don't use
Psyco ;-)

I discovered I hadn't got it quite right (it still missed some). Here's
the fixed code:

import math

def sumsq(n, depth=0):
    if n == 0:
        return [[]]
    root = int(math.sqrt(n))
    square = root ** 2
    sums = [[square] + s for s in sumsq(n - square, depth + 1)]
    while root > 0:
        square = root ** 2
        if square * len(sums[0]) < n:
            break
        more_sums = [[square] + s for s in sumsq(n - square, depth + 1)]
        if len(more_sums[0]) == len(sums[0]):
            sums.extend(more_sums)
        elif len(more_sums[0]) < len(sums[0]):
            sums = more_sums
        root -= 1
    sums = set(tuple(sorted(s, reverse=True)) for s in sums)
    sums = [list(s) for s in sorted(sums, reverse=True)]
    return sums

for n in range(1, 150):
    print n, sumsq(n)
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to