首先,本题用dfs可以枚举所有结果情况,然后利用set的唯一性即可,注意定义set的时候,要使用从大到小的存储方式,否则默认是从小到大的排列方式,代码如下:
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<set>
using namespace std;
int n,r;
int a[20];
//从大到小排列
set<int,greater<int> > s;
bool visited[20];
void dfs(int pos,int cnt,int sum){
//当前的位置,当前的数字个数,当前总值
if(cnt==r){
s.insert(sum);
return ;
}
//进行搜索
if(pos+1<=n && cnt+1<=r){
dfs(pos+1,cnt+1,sum*10+a[pos+1]); //加上下一项
dfs(pos+1,cnt,sum); //不加下一项
}
return ;
}
int main(){
cin >> n>> r;
for(int i=1;i<=n;i++){
a[i]=n-i+1;
visited[i]=false;
}
dfs(0,0,0);
for(set<int,greater<int> >::iterator ite=s.begin();ite!=s.end();ite++){
cout<<*ite<<endl;
}
return 0;
}
附上set的排列方式:greater(从大到小)
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int,greater<int> > s;
for(int i=1;i<=5;i++){
s.insert(i);
}
for(set<int,greater<int> >::iterator ite=s.begin();ite!=s.end();ite++){
cout<<*ite<<" "; //5 4 3 2 1
}
return 0;
}