—> 传送门
从 1 ~ n n n 这 n n n 个整数随机选取 m m m 个,输出所有可能的选择方案
在指数型基础上改一下即可。这里用到了剪枝,在图论当中的运用非常普遍。如果能够及时的发现当前问题是无解的,就不需要到达问题边界才返回结果。如果已经选择了超过 m m m 个数,或者即使再选上剩余所有的数也不够 m m m 个,就可以提前得知当前的问题无解。这样我们一旦进入无解的分支就会立刻返回,时间复杂度也就从 2 n 2^n 2n降低到了 C n m C_n^m Cnm。
C n m C_n^m Cnm
#include
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
pair<string,int> a[N];
int n,m;
vector<int> vec;
void calc(int x)
{
if(vec.size() > m || vec.size() + (n - x + 1) < m){//剪枝
return;
}
if(x == n + 1){
for(auto v : vec) cout << v << ' ';
cout << endl;
return;
}
vec.push_back(x);
calc(x + 1);//选
vec.pop_back();//还原现场
calc(x + 1);//不选
}
int main()
{
cin >> n >> m;
calc(1);
return 0;
}