信息奥赛一本通1221:分成互质组

【题目描述】
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?

【输入】
第一行是一个正整数n。1 ≤ n ≤ 10。

第二行是n个不大于10000的正整数。

【输出】
一个正整数,即最少需要的组数。

【输入样例】
6
14 20 33 117 143 175
【输出样例】
3

我的解题思路:
假设分成了k组。有a[n]个数据。
先找第一组,第一组第一个数为a[1],第二个数从第二个位置开始找,后一个数从前一个数的位置往后找,直到数组遍历结束,第一组数据找完。找过的数据都标记一下使用状态为1。
……
第k-1组的第一个数的下标为flag
第k组的第一个数据从flag+1处往后找

每个数据加入对应的互质组后,剩余的数字个数减1
……
当找到第k组时,先判断剩余数字个数是否为0,如果为0,则分组结束,输出结果。如果不为0,则在剩余所有数字中,找第k+1组的数据。

代码如下:

//1221:分成互质组

#include
using namespace std;
//互质数指两个数或多个数的公因数只有1 
int n,a[11];
int use[11];//记录第i个数是否已经是某个互质数组里的; 
int hz[11][11];//hz[i][0]记录第i组互质数共有几个数字,hz[i][j]为第i组的互质数中的第j个数字 
int ln;//记录剩余几个数字没有加入互质组
int flag=0;//记录前一组互质数的第一个数字在原数组中的位置 
int num;//记录有几组 

bool huzhi(int x,int y)//判断a,b两个自然数是否互质
{
	for(int i=2;i<=x/2&&i<=y/2;i++)
	{
		if(x%i==0&&y%i==0)
			return false;
	}
	return true;
}
void dfs(int k)//找第k组互质数 
{
	num=k-1;
	int t;
	if(ln==0)//没有数字未加入互质数组 
	{
		//cout<>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	ln=n;
	dfs(1);
	cout<

你可能感兴趣的:(C++)