洛谷[P1157 组合的输出] {暴力枚举} 奋斗的珂珂~

    技术2025-04-01  17

    洛谷[P1157 组合的输出] {暴力枚举}

    题目描述

    排列与组合是常用的数学方法,其中组合就是从nn个元素中抽出rr个元素(不分顺序且r≤n),我们可以简单地将nn个元素理解为自然数1,2,…,n,从中任取r个数。

    现要求你输出所有组合。

    例如n=5,r=3,所有组合为:

    123,124,125,134,135,145,234,235,245,345

    输入格式

    一行两个自然数n,r(1<n<21,0≤r≤n)。

    输出格式

    所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

    **注意哦!输出时,每个数字需要3个场宽,pascal可以这样:

    write(ans:3);

    输入输出样例

    输入 5 3 输出 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

    解释

    使用next_permutation()全排列的情况是:

    0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0

    完整代码

    #include<bits/stdc++.h> using namespace std; int a[30]; int main() { int m,n; scanf("%d %d",&m,&n); for(int i=n+1;i<=m;i++) { a[i]=1;//取得几位让几位为0,因为从小到大,所以让前几位先为0 } do{ for(int i=1;i<=m;i++) {//每个元素占用3个字符的位置 if(a[i]==0) printf("%3d",i); //因为stl不会出现排序一样的排列方式,放心取,而且保证从小到大 } cout<<endl; }while(next_permutation(a+1,a+m+1)); return 0; }
    Processed: 0.011, SQL: 9