Partition Problem

Emile van Sebille emile at fenx.com
Mon Jul 16 16:30:15 CEST 2001


Borrowing Tim's klistcombs:

def klistcombs(s, k):
    """Returns list of combinations of S taken K at a time.

    S must be a list.
    K must be >= 0.
    If K > len(S), an empty list is returned.
    Else if K is 0, a singleton list containing an empty list
    is returned.
    The k-combinations are returned in lexicographic order
    of their indices.
"""
    if k < 0:
        raise ValueError, "arg k == %d not >= 0" % k
    if len(s) < k:
        return []
    if k == 0:
        return [[]]

    answer = []
    indices = range(k)
    indices[-1] = indices[-1] - 1
    while 1:
        limit = len(s) - 1
        i = k - 1
        while i >= 0 and indices[i] == limit:
            i = i - 1
            limit = limit - 1
        if i < 0:
            break
        val = indices[i]
        for i in xrange( i, k ):
            val = val + 1
            indices[i] = val
        temp = []
        for i in indices:
            temp.append( s[i] )
        answer.append( temp )

    return answer        

def Partition(n,k):
    res=[[0]*k]                           
    res[0][0]=(n-k+1)                     
    for x in range(1,k):
        res[0][x]=1
    current = res[0][:]
    for i,j in klistcombs(range(k),2):
        while current[i] > current[j]+1:
            current[i] -= 1
            current[j] += 1
            res.append(current[:])
    return res

for i in Partition(9,3):
    print '\n\n',i

HTH,

-- 

Emile van Sebille
emile at fenx.com




More information about the Python-list mailing list