题目描述:
给定 n 个正整数,将它们分组,使得每组中任意两个数互质。
至少要分成多少个组?
输入格式
第一行是一个正整数 n。
第二行是 n 个不大于10000的正整数。
输出格式
一个正整数,即最少需要的组数。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int n;
int w[15];
int ans=15;
int g[15][15];
bool st[15];
bool check(int g[],int gc,int x)
{for(int i=0;i<gc;i++)if(__gcd(w[x],w[g[i]])>1) return false;return true;
}
void dfs(int u,int gc,int tc)//几个组,这个组多少个,一共看了多少
{if(u>=ans) return;if(tc==n){ ans=u;//看完了更新答案return;}bool flag=true;for(int i=gc;i<n;i++)if(!st[i]&&check(g[u],gc,i)){g[u][gc] = i;st[i]=1;//不用重复加dfs(u,gc+1,tc+1);st[i]=0;//回溯flag=0;}if(flag) dfs(u+1,0,tc);//新开一组,tc并不用变了
}
int main()
{cin>>n;for(int i=0;i<n;i++) cin>>w[i];dfs(1,0,0);cout<<ans;return 0;
}