时间限制: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)个数的所有组合。
思路:代码参考的,很有毒性的一道水题。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 12;
int a[maxn];
int n,r;
void dfs(int x,int y)
{
if(y==0)
{
for(int i=r;i>0;i--)
cout<<a[i];
cout<<endl;
return ; //找到结果,然乎返回
}
for(int i=x;i>=y;i--)
{
a[y]=i;
//下一步如果将i-1换成x-1,那么回溯的时候会出现第二位大于第三位的情况
dfs(i-1,y-1); //注意这一步回溯得毒
}
}
int main()
{
while(cin>>n>>r)
{
dfs(n,r);
}
return 0;
}