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

浙公网安备 33010602011771号