例题:递归实现组合型枚举
在子集枚举的基础上,进行剪枝
vector<int> chosen;
void dfs(int x)
{
if (chosen.size() > m || chosen.size() + (n - x + 1) < m) return ;
if (x == n + 1)
{
//如何输出状态
for (int i = 0; i < chosen.size(); i++)
printf("%d ", chosen[i]);
puts("");
return ;
}
//选x
chosen.push_back(x);
dfs(x + 1);
chosen.pop_back();
//不选x
dfs(x + 1);
}
// 递归实现,枚举的时候带着顺序
// get_combination(已经选了几个数,前一个选的是几)
void get_combination(int u, int last)
{
if (u == m){
for (int i = 0; i < m; i++) printf("%d ", chosen[i]);
puts("");
}
for (int j = last + 1; j <= n; j++){
chosen.push_back(j);
get_combination(u + 1, j);
chosen.pop_back();
}
}
// 调用get_combination(0, 0);
//位运算版本,这是进阶的
//state表示状态
void dfs(int u, int sum, int state)
{
if (sum > m || sum + n - u < m) return ;
if (sum == m)
{
for (int i = 0; i < n; i++)
if (state >> i & 1)
cout << i + 1 << ' ';
puts("");
return ;
}
dfs(u + 1, sum + 1, state | 1 << u);
dfs(u + 1, sum , state );
}