【go/方法记录】数学中的组合问题

问题描述

  • 主要解决数学中排列组合中的组合问题,即:
    C n r = A n r r ! C_n^r=\frac{A_n^r}{r!} Cnr=r!Anr

解决

  • 参见这个
  • 原理
    • 计算 ∑ r = 0 n C n r \sum_{r=0}^n C_n^r r=0nCnr,即二项式定理,共 2 n 2^n 2n种组合,可以使用n个比特位表示。
      例如 n = 3 n=3 n=3时:
      000,001,010,011,100,101,110,111
    • 取出其中满足:bit位1的数目为r的组合,即结果
      例如 n = 3 , r = 2 n=3,r=2 n=3,r=2时:
      011,101,110
  • 代码
    // 其他数组类型均可使用
    func Combinations(set []string, n int) (subsets [][]string) {
          
          
    	length := uint(len(set))
    
    	if n <= 0 {
          
          
    		return
    	}
    
    	if n > len(set) {
          
          
    		n = len(set)
    	}
    
    	// 从1遍历到2^length
    	for subsetBits := 1; subsetBits < (1 << length); subsetBits++ {
          
          
    		// 如果subsetBits中bit 1的数量不为n,跳过
    		if n > 0 && bits.OnesCount(uint(subsetBits)) != n {
          
          
    			continue
    		}
    
    		var subset []string
    
    		// 将对应bit 1的位置(index)对应的set[index]取出来
    		for object := uint(0); object < length; object++ {
          
          
    			if (subsetBits>>object)&1 == 1 {
          
          
    				subset = append(subset, set[object])
    			}
    		}
    		// 添加到返回值
    		subsets = append(subsets, subset)
    	}
    	return subsets
    }
    

猜你喜欢

转载自blog.csdn.net/qq_33446100/article/details/120252545