分成互质组
时间限制: 1s 内存限制: 128MB
题目描述
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入格式
第一行是一个正整数n。1 ≤ n ≤ 10。
第二行是n个不大于10000的正整数。
输出格式
一个正整数,即最少需要的组数。
样例输入
6
14 20 33 117 143 175
样例输出
3
代码
/*
互质:n个整数的最大公因数是1
*/
#include <bits/stdc++.h>
using namespace std;
int n;
int a[11];
int b[11][11];//分组
int c[11];//记录分组中有几个数
int ct,t,flag;
bool check(int u,int v){
int z=min(u,v);
for(int j=2;j<=z;j++){
if(u%j==0&&v%j==0)
return false;
}
return true;//互质
}
void dfs(int x){
if(x>n){
ct=min(ct,t);
return;
}
for(int i=1;i<=t;i++){//t个分组
flag=0;int k;
for(k=1;k<=c[i];k++){//每个分组中的数
if(check(b[i][k],a[x])==false){//不能放
flag=1;
break;
}
}
if(flag==0){//能放
b[i][k]=a[x];//放入分组
c[i]++;//数量加一
dfs(x+1);
c[i]--;
b[i][k]=0;
}
}
if(flag==1){//前面的分组都不能装进去,新开一个分组
t++;//分组数增加
b[t][1]=a[x];//放入
c[t]=1;//数量
dfs(x+1);
c[t]=0;
b[t][1]=0;
t--;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ct=n,t=1;
b[1][1]=a[1],c[1]=1;
dfs(2);
cout<<ct<<endl;
return 0;
}
总结
做本题时有两个深搜入口,要注意每种方案有重新选择的可能,再者是分组用单独的二维数组保存,不然写起来思路会有点混乱。