思路:看了答案才会的:很明显是搜索,dfs(x,y)表示搜到了第x个数,现在有y个集合,对于一个新的数字,有两种情况:建立一个新的集合,或者加入之前的一个集合
然后即用循环枚举组,其中的每个数,如果满足,则放入,循环结束后在新成立一个集合,枚举。开始时dfs(0,0)现在正在第x个数,有y组,刚开始时一个数都没有。
#include<iostream>
using namespace std;
int n,ans=1e9+1;
bool flag;
int a[10010],b[10010];
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
void dfs(int x,int y)
{
if(x==n+1)
{
ans=min(ans,y);
return;
}
for(int i=1;i<=y;i++)
{
flag=true;
for(int j=1;j<x;j++)
{
if(b[j]==i)
{
if(gcd(a[x],a[j])!=1)
{
flag=false;
break;
}
}
}
if(flag)
{
b[x]=i;
dfs(x+1,y);
b[x]=0;
}
}
b[x]=y+1;
dfs(x+1,y+1);
b[x]=0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(0,0);
cout<<ans<<endl;
return 0;
}