题目链接 组合数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543 542 541 532 531 521 432 431 421 321
来源
上传者
描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
思路:简单的记忆化搜索dfs
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int k[22]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},vis[22]={0};
int n,r;
void dfs(int sum)
{
if(sum<1){
int num=0;
for(int i=n;i>=1;i--)
if(vis[i])
num++;
if(num!=r)
return;
for(int i=n;i>=1;i--){//如果在主函数中选择此功能的实现,
if(vis[i]) printf("%d",k[i]);//则容易被覆盖
}
printf("\n");
return;
}
vis[sum]=1;
dfs(sum-1);
vis[sum]=0;
dfs(sum-1);
}
int main()
{
scanf("%d%d",&n,&r);
dfs(n);
}