ještě snad už poslední oprava.
def table(k, ruler):
    rows = [[False] * ruler[0] + [True] * (k - ruler[0])]
    for item in ruler[1:]:
        newrow = [False] * k
        for j in range(k):
            if j - item >= 0 and rows[-1][j - item]:
                newrow[j] = True
            if j + item < k and rows[-1][j + item]:
                newrow[j] = True
        rows.append(newrow)
    return rows
def bactrace(table, ruler):
    last = table[-1].index(True)
    res = []
    for i, item in reversed(list(enumerate(ruler))[1:]):
        if last - item >= 0 and table[i - 1][last - item]:
            last = last - item
            res.append((item, '+'))
        else:
            last = last + item
            res.append((item, '-'))
    res.append((ruler[0], '+'))
    return list(reversed(res))
def find_folding(ruler):
    maxlen = max(ruler)
    for k in range(maxlen, maxlen*2 + 1):
        t = table(k, ruler)
        if any(t[-1]):
            bt = bactrace(t, ruler)
            return k - 1, bt
def format_folding(res):
    return ' '.join(['%s %s ' % (sign, item) for item, sign in res[1]])
if __name__ == '__main__':
    ruler = [3, 5, 2, 6]
    print format_folding(find_folding(ruler))