枚举方式就是DFS,设置剪枝和条件检查,不满足则return回溯,后面进行递归,不同的在于枚举不仅仅得到一个答案就回溯了,而是得到所有答案,因此再进行一次calc函数递归,第一个剪枝条件是为了得到m个数后输出,第二个剪枝条件是在到达最后几个数后防止剩余数不够及时return回去结束程序
c++代码:
#include<bits/stdc++.h>
using namespace std;
//从n中取m个数,有多少种组合
int n;
int m;
vector<int> chosen;
void calc(int x)
{
//剪枝
if(chosen.size()>m||chosen.size()+(n-x+1)<m)
return;
//check检查是否满足条件
if(x-1==n)
{
for(int i=0;i<chosen.size();i++)
{
cout<<chosen[i];
}
puts(" ");
return;
}
chosen.push_back(x);
calc(x+1);
chosen.pop_back();
calc(x+1);
}
int main()
{
cin>>n>>m;
calc(1);
return 0;
}