分成互质组
给定 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; }