最小子集问题

作者: 冷水调画 | 来源:发表于2019-03-31 14:54 被阅读0次
    # 题目:
    # 求在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)                                  # 打印出满足条件的子集
    

    相关文章

      网友评论

        本文标题:最小子集问题

        本文链接:https://www.haomeiwen.com/subject/hutubqtx.html