当前位置:首页 > C++目录 > 正文内容

组合数的写法

亿万年的星光4年前 (2021-10-04)C++目录2968

前面我们写过 全排列和排列数 等。

这篇文章。我们写一下组合数。

例题:

从n个数中,选出m个,一共有多少种不同的选法?


这是一道典型的组合数公式。我们直接用dfs公式肯定会出现重复的。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int pd[100],ans[100];//pd数组是判断是否用过这个数,ans是结果数组
void print() { //输出函数
   int i;
   for(i=1; i<=m; i++)
       printf("%2d",ans[i]);//保留位常宽
   cout<<endl;
}
void dfs(int k,int f) { //深搜函数,当前是第k格
   int i;
   if(k==m) { //填满了的时候
       print();//输出当前解
       return;
   }
   f++;
   for(i=f; i<=n; i++) { //1-n循环填数
       if(pd[i]==0) { //如果当前数没有用过
           pd[i]=1;//标记一下,1表示当前这个数字使用过
           ans[k+1]=i;//把这个数填入结果数组
                      dfs(k+1,i);//填下一个
           pd[i]=0;//回溯
       }
   }
}
int main() {
   cin>>n>>m;
   dfs(0,0);//注意,这里是从第0格开始的!
   return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    图的访问与存储—临接表

    图的访问与存储—临接表

            在图论中,邻接表(Adjacency List) 是表示图(包括无向图、有向图、带权图)的一种高效数据结构,核心思想是为图中的每个顶点...

    【题解】围圈报数(约瑟夫问题)

    【题解】围圈报数(约瑟夫问题)

    【题目描述】有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个热呢又出列,... ,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,......

    STL入门——简单介绍

    一、STL是什么?    STL(Standard Template Library)即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ S...

    C++中的位宽与保留小数

    C++中的位宽与保留小数

    一、setw函数C++ setw() 函数用于设置字段的宽度,语法格式如下setw(n)比如:#include <bits/stdc++.h> using names...

    【算法】扩展欧几里得算法

    一、欧几里得算法我们前面学过求最大公约数的算法:欧几里得算法(又叫辗转相除法) ,一般缩写是gcd,在C++中经常写成如下形式:int gcd(int a,int b)...

    C++中箭头指针的含义及用法

    C++中箭头指针的含义及用法

    0.前言c++中我们在一些程序中看到箭头 p—>stu 类似于这样的表示。今天就简单来解释一下点运算和箭头运算。1.点运算常见的点一般出现在结构体中,比如下面的代码:#include<io...