zoukankan      html  css  js  c++  java
  • 利用字典序法生成组合数

    在组合数学的这本书中,生成组合数字有很多中方法,比较常用的序数法,字典序法
    本文采用字典序法,生成一堆组合数字,即C(n,r),从n个数字中取得r个,算法完整的定义如下:

    从{1,2,…,n}中取r-组合表示为C1C2…Cr,令C1<C2<…<Cr,其中有i ≤Ci≤(n-r+i), i=1,2,…,r
    第一个组合为{1,2 ,…,r}
    生成后序组合的规则
    对C1C2…Cr从右到左扫描,找出第一个满足Ci<(n-r+i)的i
    Ci<-Ci+1
    Cj<-Cj-1+1 , j=i+1,i+2,…r

    根据以上的算法描述,写出算法:

    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 项

  • 相关阅读:
    怎样装两个MySQL服务器
    MySQL 8.0.12的安装与卸载
    位运算符2
    位运算符
    赋值运算符
    love心形
    变量之间运算
    变量
    标识符
    算术运算符
  • 原文地址:https://www.cnblogs.com/whyaza/p/9672563.html
Copyright © 2011-2022 走看看