Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

    • 01分数规划学习笔记
    • CDQ分治学习笔记
    • wqs二分学习笔记
    • 一两句话小技巧
    • 单调性应用学习笔记
    • 哈希函数(Hash)函数的设计
    • 带权并查集处理线段
    • 环检测算法学习笔记
    • 约瑟夫环学习笔记
    • 组合情况
    • 高效位运算

组合情况

# 前言

给定nnn个互不相同的元素,要求从中取出ggg个。

很显然,取出ggg个不同组合的方法数有cnt=Cng=(ng)cnt=C_n^g=\large\tbinom{n}{g}cnt=Cng​=(gn​)种。

那如果要求所有方案(并输出),该怎么办?

# Buckles's Solution(字典序最小)

long long Comb[20][20];
void init(int n){
    comb[0][0] = 1;
    for(int i=1; i<=n; i++){
        comb[i][0] = 1;
        for(int j=1; j<=i; j+++) comb[i][j] = comb[i-1][j] + comb[i-1][j-1];
    }
}
/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = Comb[n-c[i]][p-(i+1)];
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# Python

print list(itertools.combinations('123', 2))
# [('1', '2'), ('1', '3'), ('2', '3')]
1
2
上次更新: 2021/02/24, 03:37:30
约瑟夫环学习笔记
高效位运算

← 约瑟夫环学习笔记 高效位运算→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式