例题:递归实现组合型枚举
在子集枚举的基础上,进行剪枝
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 ;}//选xchosen.push_back(x);dfs(x + 1);chosen.pop_back();//不选xdfs(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 );}
