组合问题,n个元素分成k组-5

题目要求:

P(n,k)代表将n个元素分成k个非空分组集合的总集。例如,当L=[1,2,3], P(3,2)=12,3; 13,2; 1,23.我们就假设此n个元素是从1到n。P(4,3)=1,2,34;  14,2,3; 1, 24, 3;  12, 3, 4; 4,13, 2; 23, 1, 4. 这6个 ,次序不拘。

思想:结果列表R是三重列表,一个集合放在一个二重列表中,所有的集合放在一个三重列表R中。

此题目的思想类似于在解组合问题_{n}^{k}\textrm{C}时的思想。此将问题分为两部分:L1表示选取L[0]作为一组,其他n-1个元素分成k-1组;L2表示把除了L[0]之外的分成k组,L[0]插入到这k个组中。递归处理。  

代码如下: 

#此程序的作用:将n个元素分成k组,输出分组

def divide_set(L,k):#把L分成k组
    if k==0:return [[[]]]
    if k==1:return [[L]]
    L1=[];L2=[]
    if len(L)-1>=k:
        L2=divide_set(L[1:],k)  #把除了第一个元素之外的分成k组,第一个元素插入到其中
        #print(L2)
    if len(L)>=k:
        L1=divide_set(L[1:],k-1)#把第一个元素作为一组,其他分成k-1组
        #print(L1)
     R=[]#R是三重列表
    
    #把L[0]插入到L2中
    for t in L2:  #遍历L2中每个二重列表,一个二重列表代表一个分组集合
        for i in range(0,len(t)):
            x=t[:i]+[[L[0]]+t[i]]+t[i+1:]#把L[0]拼接到一个集合中的第i个分组中,x是二重列表
            R.append(x)
    
    #把L[0]添加到集合中L1中  
    for e in L1:  #遍历L1的每个元素,e是二重列表,代表一个集合
        e.append([L[0]])
        R.append(e)
    return R

while True:
    n=int(input("请输入元素个数:"))
    k=int(input("请输入分组个数:"))
    L=[i+1 for i in range(n)]
    R=divide_set(L,k)
    print(R)
    for i in range(len(R)):
        print(R[i])

 

你可能感兴趣的:(Homework-Python)