题目要求:
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中。
此题目的思想类似于在解组合问题时的思想。此将问题分为两部分: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])