【题目描述】
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
【输入】
第一行是一个正整数n。1 ≤ n ≤ 10。
第二行是n个不大于10000的正整数。
【输出】
一个正整数,即最少需要的组数。
【输入样例】
6
14 20 33 117 143 175
【输出样例】
3
题目分析:
咱也不懂这个题能用啥数学性质,就直接暴力的搜索了。这个题在我看来只要心中有一个明确的思路并不断地修改自己内心的想法以及代码,基本就没什么问题。
代码:
#include<iostream>
using namespace std;
int n,a[11],sum=999999,flag,b[101];//b[i]表示第i个数在第几组
void search(int ,int);
int gcd(int,int);//辗转相除法递归求最大公约数
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
search(1,1);//从第一个数放到第一个集合开始搜索
cout<<sum;
return 0;
}
void search(int shu,int ji)//shu表示当前判断第几个数。ji表示当前有几个集合
{
if(shu==n+1)
{
sum=min(ji,sum);//集合数目取所有情况中的最小值
return;
}
else for(int i=1;i<=ji;i++)
{
flag=1;
for(int j=1;j<shu;j++)
{
if(b[j]==i)
if(gcd(a[shu],a[j])!=1)
{
flag=0;
break;//只要出现一个和当前数字不形成互质数的数字即可跳出循环
}
}
if(flag)//当前数字可以在第i个集合
{
b[shu]=i;//将第shu个数放到第i个集合
search(shu+1,ji);//因为当前数没有创建新的集合所以只用搜索下一个数即可,不需要搜索下一个集合
b[shu]=0;//回溯
}
}
b[shu]=ji+1;//把第shu个数放到第ji+1个集合内并搜索下一个数以及下一个区间
search(shu+1,ji+1);//当前的数没有已知集合可以存放,则自己创立一个新的集合
b[shu]=0;//回溯
}
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
结果:
输入:
6
14 20 33 117 143 175
输出:
3