1 条题解

  • 0
    @ 2026-2-25 11:25:54

    生成组合的核心是保证组合内元素严格递增,这样既避免重复,又能按字典序输出。我们用递归(回溯法)逐个位置填数:

    1. 用数组 a 保存当前构建的组合。
    2. 从第1个位置(索引0)开始填数,每个位置的数必须比前一个数大(第一个数从1开始)。
    3. 为给后面留够数字,当前数最大只能到 n - 还需填的数字个数 + 1(如选3个数,当前填第1个时最大到 n-2)。
    4. 填完r个数时,按格式输出即可。

    代码

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int n, r, a[20];
    
    void dfs(int k, int lst) {
        if (k == r) {
            for (int i = 0; i < r; ++i)
                cout << setw(3) << a[i];
            cout << endl;
            return;
        }
        for (int i = lst + 1; i <= n - r + k + 1; ++i) {
            a[k] = i;
            dfs(k + 1, i);
        }
    }
    
    int main() {
        cin >> n >> r;
        dfs(0, 0);
        return 0;
    }
    
    • 1

    信息

    ID
    157
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    21
    已通过
    10
    上传者