1 条题解

  • 0
    @ 2025-10-8 16:54:48

    B21 DFS剪枝 分成互质组

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=11;
    int n,a[N],ans=N,cnt;
    vector<int> g[N];
    
    int gcd(int x,int y){
      return y?gcd(y,x%y):x;
    }
    bool check(int x,int i){
      for(int j=0; j<g[i].size(); j++)
        if(gcd(x,g[i][j])>1) return false;
      return true; 
    }
    void dfs(int u){
      if(cnt>=ans) return;       //剪枝
      if(u==n){ans=cnt; return;} //边界
      for(int i=0; i<cnt; i++)   //枚举已有组
        if(check(a[u],i)){ //如果a[u]能放第i组
          g[i].push_back(a[u]); //放入第i组
          dfs(u+1);
          g[i].pop_back();      //恢复现场
        }
      g[cnt++].push_back(a[u]); //新开一组
      dfs(u+1);
      g[--cnt].pop_back();      //恢复现场
    }
    int main(){
      scanf("%d",&n);
      for(int i=0; i<n; i++)scanf("%d",a+i);
      dfs(0);
      printf("%d\n",ans);
    }
    
    • 1

    信息

    ID
    946
    时间
    1000ms
    内存
    64MiB
    难度
    7
    标签
    递交数
    184
    已通过
    43
    上传者