当前位置:首页 > C++知识 > 正文内容

组合数的写法

亿万年的星光4年前 (2021-10-04)C++知识2427

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

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

例题:

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


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

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

分享给朋友:

相关文章

STL入门——容器3:map

一、定义    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据&nb...

第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

第十四届全国青少年信息学奥林匹克联赛初赛试题             ...

指针(三):指针与函数

1.交换的例子#include<iostream> #include<cstdio> #include<cstring> using namespa...

【算法】单链表的一些操作(存取、查找、取出、插入、删除)

一、单链表结构的建立与输出#include<iostream> using namespace std; struct Node{ int ...

取模运算总结——数论

编程竞赛有相当一部分题目的结果过于庞大,整数类型无法存储,往往只要求输出取模的结果。例如(a+b)%p,若a+b的结果我们存储不了,再去取模,结果显然不对,我们为了防止溢出,可以先分别对a取模,b取模...

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

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

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