最小子集問(wèn)題

# 題目:
# 求在Rn中找出個(gè)數(shù)最少的一個(gè)子集,這個(gè)子集的所有元素的并集為U,要求U ∩ C = C,且U ∪ C = U,請(qǐng)寫(xiě)出求解這樣的一個(gè)子集的通用算法。

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的集合對(duì)比遍歷對(duì)比,找出符合要求且元素?cái)?shù)最少的Rn(可能是多個(gè))

C_set = set(C)                                 # 求出C的集合(即去重)
subset = [R]                                   # 滿(mǎn)足U∩C = C,且U∪C = U的目標(biāo)子集初始化為R,命名為subset

for i in Rn:                                   # 遍歷Rn
    for j in C_set:                            # 遍歷C的集合,如果C集合中的每個(gè)元素都在子集中,則下一步,否則剔除
        if j not in set(i):
            break
    else:
        if len(i) < len(subset[0]):            # 若該子集元素個(gè)數(shù)<subset中子集的元素個(gè)數(shù),則清空subset,將該子集設(shè)為新的subset
            subset = [[]]
            subset[0] = i
        elif len(i) == len(subset[0]):         # 若該子集元素個(gè)數(shù)=subset中子集的元素個(gè)數(shù),則將此子集添加到subset
            subset.append(i)

print(subset)                                  # 打印出滿(mǎn)足條件的子集
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容