例题:递归实现组合型枚举

在子集枚举的基础上,进行剪枝

  1. vector<int> chosen;
  2. void dfs(int x)
  3. {
  4. if (chosen.size() > m || chosen.size() + (n - x + 1) < m) return ;
  5. if (x == n + 1)
  6. {
  7. //如何输出状态
  8. for (int i = 0; i < chosen.size(); i++)
  9. printf("%d ", chosen[i]);
  10. puts("");
  11. return ;
  12. }
  13. //选x
  14. chosen.push_back(x);
  15. dfs(x + 1);
  16. chosen.pop_back();
  17. //不选x
  18. dfs(x + 1);
  19. }
  1. // 递归实现,枚举的时候带着顺序
  2. // get_combination(已经选了几个数,前一个选的是几)
  3. void get_combination(int u, int last)
  4. {
  5. if (u == m){
  6. for (int i = 0; i < m; i++) printf("%d ", chosen[i]);
  7. puts("");
  8. }
  9. for (int j = last + 1; j <= n; j++){
  10. chosen.push_back(j);
  11. get_combination(u + 1, j);
  12. chosen.pop_back();
  13. }
  14. }
  15. // 调用get_combination(0, 0);
  1. //位运算版本,这是进阶的
  2. //state表示状态
  3. void dfs(int u, int sum, int state)
  4. {
  5. if (sum > m || sum + n - u < m) return ;
  6. if (sum == m)
  7. {
  8. for (int i = 0; i < n; i++)
  9. if (state >> i & 1)
  10. cout << i + 1 << ' ';
  11. puts("");
  12. return ;
  13. }
  14. dfs(u + 1, sum + 1, state | 1 << u);
  15. dfs(u + 1, sum , state );
  16. }