思路:DFS,开一个数组存储答案,然后一个数字一个数字的选即可。由于特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。所以每个数字只可能比上一个数字小,所以不必开标记数组,DFS中传一个当前数字可以选择的最大值即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 15;
int n,r,a[MAXN];
void dfs(int num,int k)//num表示每个数字能选的最大值 , K表示还有几个数字没选
{
if(k == 0)//输出答案
{
for(int i = r; i >= 1; i--)
{
printf("%d",a[i]);
}
printf("\n");
return ;
}
for(int i = num; i >= 1; i--)
{
a[k] = i;
dfs(i - 1, k - 1);
}
}
int main()
{
while(~scanf("%d%d",&n,&r))
{
dfs(n,r);
}
return 0;
}