# 题目:
# 求在Rn中找出个数最少的一个子集,这个子集的所有元素的并集为U,要求U ∩ C = C,且U ∪ C = U,请写出求解这样的一个子集的通用算法。
R = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
R1 = ['b', 'b', 'c', 'd', 'e', 'f', 'g']
R2 = ['b', 'c', 'd', 'g', 'k', 'l', 'm', 'n']
R3 = ['a', 'c', 'g', 'i', 'j', 'k', 'm', 'n']
R4 = ['a', 'c', 'd', 'f', 'g', 'i', 'j', 'k', 'm', 'n']
R5 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'n']
Rn = [R1, R2, R3, R4, R5]
C = ['b', 'b', 'd', 'g']
# -------------------------------------------------------------------------------------------------------------------
# 思路:
# 将C的集合与R1、R2…Rn的集合对比遍历对比,找出符合要求且元素数最少的Rn(可能是多个)
C_set = set(C) # 求出C的集合(即去重)
subset = [R] # 满足U∩C = C,且U∪C = U的目标子集初始化为R,命名为subset
for i in Rn: # 遍历Rn
for j in C_set: # 遍历C的集合,如果C集合中的每个元素都在子集中,则下一步,否则剔除
if j not in set(i):
break
else:
if len(i) < len(subset[0]): # 若该子集元素个数<subset中子集的元素个数,则清空subset,将该子集设为新的subset
subset = [[]]
subset[0] = i
elif len(i) == len(subset[0]): # 若该子集元素个数=subset中子集的元素个数,则将此子集添加到subset
subset.append(i)
print(subset) # 打印出满足条件的子集
网友评论