组合数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
- 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
-
输入
- 输入n、r。 输出
- 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入 -
5 3
样例输出 -
543 542 541 532 531 521 432 431 421 321
AC代码:
#include<iostream>
using namespace std;
int n, m;
int num[11];
void dfs(int x, int y){
/*
*递归方式回溯法
*/
if(y ==0){
for(int k = m ; k >=1; k--){
cout<<num[k];
}
cout<<endl;
}else{
for(int i = x; i>=y; i--){
/*
例如 n = 5 , m = 3;
num[3] 可能是 5 4 3
num[2] 可能是4 3 2( 这个值和num[3]有关必须比num[3]校
num[1] 可能是3 2 1(必须比num[2]小
结果是5 4 (3,2,1)
*/
num[y] = i;
dfs(i-1, y-1);
}
}
}
int main(){
while(cin>>n>>m){
dfs(n, m);
}
return 0;
}