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

组合数的写法

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

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

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

例题:

从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;
}


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

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

分享给朋友:

相关文章

信息学奥赛中文件流的写法

信息学奥赛中文件流的写法

头文件#include<cstdio>也可以用万能头格式如下:int main(){ freopen("xxxx.in","r",st...

C++中双冒号(::)的用法

一、作用域符号前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分如:A,B表示两个类,在A,B中都有成员member。那么A::member就...

二维数组的差分

一、基本概念二维数组差分是一种高效处理区间修改操作的数据结构技巧,常用于解决矩阵区域增减问题。差分是前缀和的逆运算,对于二维数组,差分数组 diff[i][j] 表示原数组 a[i][j] 与 a[i...

CSP-J2021年普及组复赛T2——插入排序

CSP-J2021年普及组复赛T2——插入排序

【题目描述】插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老 师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n 2...

C++小项目——实时钟表

C++小项目——实时钟表

0.前言在很多游戏中,我们要使用时间,这个时间一个是系统当前的时间,一个是服务器给你的时间。这篇文章我们尝试做一个模拟时钟。效果图如下1.任务分解1.首先我们尝试使用easyx来画一个。基本框架如下:...

【数据结构】优先队列(1)

优先队列(Priority Queue)是一种特殊的队列,它 不遵循“先进先出”(FIFO) 的原则,而是 按照优先级(Priority) 来出队。优先级高的元素 先出队,优先级低的元素 后出队。1....