【openjudge】分成互质组

描述

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

输入
第一行是一个正整数n。1 <= n <= 10。
第二行是n个不大于10000的正整数。
输出
一个正整数,即最少需要的组数。
样例输入
6
14 20 33 117 143 175
样例输出
3

感觉之前写传统的dfs写多了,现在都不知道变通,适当的时候应该改变一下思路。

这道题要求判断两两互质,所以判断的时间很多,好在数据范围比较小。当要把这个数放进来之前判断一下是否和前面的数都互质(前面的数在放进来的时候都已经判断好了)再放,这样会减少很多冗余的判断。

这样的话,dfs再加一维,表示选到了第几个数,现在有多少个集合。每次枚举每一个用过的集合,如果当前有的集合都放不下,那么就用一个新的集合来放。

【代码】

#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 2100000000
int a[20],b[20];
int ans,n;
int gcd(int a,int b){
	if (b==0) return a;
	else return gcd(b,a%b);
}
void dfs(int x,int y){
	if(x>n){
		if(y<ans) ans=y;
		return;
	}
	for(int i=1;i<=y;i++){
		bool pd=true;
		for(int j=1;j<x;j++){
			if(b[j]==i&&gcd(a[x],a[j])!=1){
				pd=false;
				break;
			}
		}
		if(pd==true){
			b[x]=i;
			dfs(x+1,y);
			b[x]=0;
		}
	}
	b[x]=y+1;
	dfs(x+1,y+1);
	b[x]=0;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	b[1]=1; ans=inf;
	dfs(2,1);
	printf("%d",ans);
}


你可能感兴趣的:(搜索,OpenJudge)