在組合數學的這本書中,生成組合數字有很多中方法,比較常用的序數法,字典序法
本文採用字典序法,生成一堆組合數字,即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 返回 當陣列內的元素是字典序排列,則生成子集時用位...