利用字典序法生成組合數

2022-06-12 17:39:11 字數 3249 閱讀 8624

在組合數學的這本書中,生成組合數字有很多中方法,比較常用的序數法,字典序法

本文採用字典序法,生成一堆組合數字,即c(n,r),從n個數字中取得r個,演算法完整的定義如下:

從中取r-組合表示為c1c2…cr,令c1<c2<…<cr,其中有i ≤ci≤(n-r+i), i=1,2,…,r

第乙個組合為

生成後序組合的規則

對c1c2…cr從右到左掃瞄,找出第乙個滿足ci<(n-r+i)的i

cicj

根據以上的演算法描述,寫出演算法:

class solution():

def dirgenerate(self, n, r):

#利用字典序法生成組合

l = [i for i in range(n+1)]

c = [i for i in range(r+1)]

print(c)

n = len(l) - 1

r = len(c) - 1

ffi = 0 # 找到的i

count = 1

while true:

for i in range( len(c) - 1 ,0,-1):

if c[i] < (n - r + i):

ffi = i

break

if i == 1 and c[i] == (n - r + i):

print('共有',count,'項')

return

c[i] = c[i] + 1

if ( i+1 <= r) and c[i+1] == (n - r + i + 1):

pass

else:

count += 1

print(c)

for j in range(i+1,r+1):

c[j] = c[j-1] + 1

if j == r:

count += 1

print(c)

if __name__ == '__main__':

n = int(input('請輸入n:'))

r = int(input('請輸入r:'))

solution().dirgenerate(n,r)

需要注意的是:

1.演算法直到產生c1=n-r+1,c2=n-r+2,...,cr=n結束,也就是說找不到ci != n-r+i 的項時結束

if i == 1 and c[i] == (n - r + i):  

print('共有',count,'項')

return

2.乙個位數加完了之後,向前面找,並且加1,此次不輸出!對之後的每一位進行加的時候也不輸出

總結一下,演算法的思想:就是從右向前掃,找到乙個不符合ci<(n-r+i)的數,對其加1,如果找到的數的i,向前面進製,那麼即它後面的每一項都比前一項大1

對了,最後附上演算法的效果圖

請輸入n:8

請輸入r:4

[0, 1, 2, 3, 4]

[0, 1, 2, 3, 5]

[0, 1, 2, 3, 6]

[0, 1, 2, 3, 7]

[0, 1, 2, 3, 8]

[0, 1, 2, 4, 5]

[0, 1, 2, 4, 6]

[0, 1, 2, 4, 7]

[0, 1, 2, 4, 8]

[0, 1, 2, 5, 6]

[0, 1, 2, 5, 7]

[0, 1, 2, 5, 8]

[0, 1, 2, 6, 7]

[0, 1, 2, 6, 8]

[0, 1, 2, 7, 8]

[0, 1, 3, 4, 5]

[0, 1, 3, 4, 6]

[0, 1, 3, 4, 7]

[0, 1, 3, 4, 8]

[0, 1, 3, 5, 6]

[0, 1, 3, 5, 7]

[0, 1, 3, 5, 8]

[0, 1, 3, 6, 7]

[0, 1, 3, 6, 8]

[0, 1, 3, 7, 8]

[0, 1, 4, 5, 6]

[0, 1, 4, 5, 7]

[0, 1, 4, 5, 8]

[0, 1, 4, 6, 7]

[0, 1, 4, 6, 8]

[0, 1, 4, 7, 8]

[0, 1, 5, 6, 7]

[0, 1, 5, 6, 8]

[0, 1, 5, 7, 8]

[0, 1, 6, 7, 8]

[0, 2, 3, 4, 5]

[0, 2, 3, 4, 6]

[0, 2, 3, 4, 7]

[0, 2, 3, 4, 8]

[0, 2, 3, 5, 6]

[0, 2, 3, 5, 7]

[0, 2, 3, 5, 8]

[0, 2, 3, 6, 7]

[0, 2, 3, 6, 8]

[0, 2, 3, 7, 8]

[0, 2, 4, 5, 6]

[0, 2, 4, 5, 7]

[0, 2, 4, 5, 8]

[0, 2, 4, 6, 7]

[0, 2, 4, 6, 8]

[0, 2, 4, 7, 8]

[0, 2, 5, 6, 7]

[0, 2, 5, 6, 8]

[0, 2, 5, 7, 8]

[0, 2, 6, 7, 8]

[0, 3, 4, 5, 6]

[0, 3, 4, 5, 7]

[0, 3, 4, 5, 8]

[0, 3, 4, 6, 7]

[0, 3, 4, 6, 8]

[0, 3, 4, 7, 8]

[0, 3, 5, 6, 7]

[0, 3, 5, 6, 8]

[0, 3, 5, 7, 8]

[0, 3, 6, 7, 8]

[0, 4, 5, 6, 7]

[0, 4, 5, 6, 8]

[0, 4, 5, 7, 8]

[0, 4, 6, 7, 8]

[0, 5, 6, 7, 8]

共有 70 項

Python 利用字典合併檔案

這個要求是這樣的 將倆個檔案合併為乙個檔案,這倆檔案具有相同的第一列,合併後的檔案為 第一列只有一列 其他列追加,與下圖cc.txt 相同aa.txt1 44 2 65 3 64 4 43bb.txt1 54 2 66 3 68 4 49 importsys printsys.path 0 with...

VBA 利用字典代替VLOOKUP

sub 代替vlookup 方法一 dim d,ar,br,cr,wb as workbook set d createobject scripting.dictionary br worksheets sheet1 a1 currentregion 需要配置的資料表 ar worksheets r...

子集生成與字典序

題目描述 請編寫乙個方法,返回某集合的所有非空子集。給定乙個int陣列a和陣列的大小int n,請返回a的所有非空子集。保證a的元素個數小於等於20,且元素互異。各子集內部從大到小排序,子集之間字典逆序排序,見樣例。測試樣例 123,456,789 返回 當陣列內的元素是字典序排列,則生成子集時用位...