分成互质组_DFS

分成互质组

 

给定 n 个正整数,将它们分组,使得每组中任意两个数互质。

至少要分成多少个组?

输入格式

第一行是一个正整数 n。

第二行是 n 个不大于10000的正整数。

输出格式

一个正整数,即最少需要的组数。

数据范围

1 ≤ n ≤ 1

输入样例:

6
14 20 33 117 143 175

输出样例:

3

折磨死我了

#include <bits/stdc++.h>
using namespace std;

const int N = 15;
int n, ans = 999;
int a[N];
int group[N][N];
bool book[N];
int q1, q2;
int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}
bool check(int i, int x, int cnt){
    for(int j = 0; j < cnt; j++){
        if(gcd(a[i],group[x][j]) > 1)return false;
    }
    return true;
}
void dfs(int cnt, int x, int group_index, int group_cnt){
    q1 = group_index;
    q2 = group_cnt;
    //printf("cnt = %d  %d  %d\n",cnt,q1,q2);
    // printf("x = %d  index = %d  ----------\n",x,group_index);
    // for(int i = 0; i < group_cnt; i++){
    //     printf("%d ",group[group_index][i]);
    // }
    // printf("\n");
    // for(int i = 0; i < group_index; i++){
    //     for(int j = 0; j < group_cnt; j++){
    //         printf("%d  ",group[i][j]);
    //     }
    //     printf("\n");
    // }
    // printf("-------\n");
    if(group_index > ans)return;
    
    if(cnt == n){
        
        ans = group_index;
        //printf("----------------------ans = %d\n",ans);
        return;
    }
    int flag = 1;
    for(int i = x; i < n; i++){
        //printf("cnt = %d i = %d\n",cnt,i);
        //printf("%d  %d\n",!book[x],check(i, group_index, group_cnt));
        if(!book[i] && check(i, group_index, group_cnt)){
            book[i] = 1;
            group[group_index][group_cnt] = a[i];
            //printf("i = %d  j = %d  group[i][j] = %d\n",group_index,group_cnt,group[group_index][group_cnt]);
            dfs(cnt + 1, i + 1, group_index, group_cnt + 1);
            book[i] = 0;
            flag = 0;
        }
    }
    if(flag){
        // for(int i = 0; i < group_cnt; i++){
        //     printf("%d ",group[group_index][i]);
        // }
        // printf("cnt = %d\n",cnt);
        dfs(cnt, 0, group_index + 1, 0);
    } 
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    
    dfs(0,0,0,0);
    
    cout << ans + 1 << endl;
    
    
    return 0;
}

  

 

 
上一篇:蓝桥杯题目---剪邮票(dfs的连通性检验)


下一篇:1220. 生命之树