计蒜客-dfs(深搜)-分为互质组
蒜头君给定 n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入格式
第一行是一个正整数 n。1≤n≤10。
第二行是 n 个不大于 10000的正整数。
输出格式一个正整数,即最少需要的组数。
用二维vector去储存,需要注意的就是在一个组内,在往进添加元素时,只要有一个已经在vector中的元素不互质,这个组就不可取
#include<bits/stdc++.h>
using namespace std;
vector<int> b[10];
int n,len,a[10],ans=10;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
bool judge(int d,int k){
for(int i=0;i<b[k].size();i++)
if(gcd(d,b[k][i])>1)
return false;//只要有一个不互质,这个组就不可取
return true;
}
void dfs(int x){
if(x==n){
ans=min(ans,len);
return;
}
for(int i=0;i<len;i++)
if(judge(a[x],i))
{
b[i].push_back(a[x]);
dfs(x+1);
}
b[len++].push_back(a[x]);
dfs(x+1);
b[--len].pop_back();//回溯
}
int main(){
scanf("%d",&n);
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
dfs(0);
printf("%d",ans);
return 0;
}