AcWing 93. 递归实现组合型枚举

image

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=30;  // 多开几个,防止边界越界
int n,m;
int way[N];  // 表示方案

// u 代表当前枚举的位置,start表示从第几个数开始枚举
void dfs(int u,int start){
  // 剪枝(优化步骤)
  if(u-1+ n-start+1<m){ // 如果把后面所有数都选上,都不够m个,当前分支就一定无解
    return ;
  }
  
  
  if(u > m){
      for(int i=1;i<=m;i++){
        cout<<way[i]<<" ";   // 输出方案 
      }
    cout<<endl;
    return;
  }
  for(int i=start;i<=n;i++){
    way[u]=i;
    dfs(u+1,i+1);
    // 恢复现场
    way[u]=0; // 0表示为空
  }
}


int main(){
  cin>>n>>m;
  dfs(1,1);
  return 0;
}

题解2

// 组合型枚举
// 画递归树理解题意


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=30;
int n,m;
int path[N];
bool st[N];
// start表示可选数字的起始位置
void dfs(int u,int start){
  if(u>m){
    for(int i=1;i<=m;i++){
      cout<<path[i]<<" ";
    }
    cout<<endl;
    return ;
  }else{
    //  空格填的元素要比前一个元素大
    for(int i=start;i<=n;i++){
      if(!st[i]){
        path[u]=i;
        st[i]=true;
        dfs(u+1,i+1);
        st[i]=false;
        path[u]=0;
      }
    }
  }
}


int main(){
  cin>>n>>m;
  dfs(1,1);
  
  return 0;
}



posted @ 2022-10-29 13:56  努力、奋斗啊  阅读(26)  评论(0编辑  收藏  举报