1 条题解

  • 0
    @ 2023-10-18 10:01:27

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=15;
    int a[N],group[N][N];
    bool st[N];
    int ans=N;
    int n;
    int gcd(int a,int b) //最大公约数
    {
    	if(b==0) return a;
    	return gcd(b,a%b);
    }
    bool check(int g[],int gid,int i) //判断第u组的gid个元素和a[i]有没有冲突
    {
    	for(int j=0;j<gid;j++)
    	{
    		if(gcd(a[g[j]],a[i])>1)
    		{
    			return false; //有冲突
    		}
    	}
    	return true; //没有冲突
    }
    void dfs(int u,int gid,int cnt,int s) 
    //第u组,第u组移动gid个元素,当前一共搜索了cnt个元素,当前组从s开始搜索
    {
    	if(u>=ans) return ; //优化
    	if(cnt==n) //一共找到了n个
    	{
    		ans=u;
    		return ;
    	}
    	bool flag=true;
    	for(int i=s;i<n;i++) //枚举以后的每个元素
    	{
    		if(!st[i]&&check(group[u],gid,i))
    		{
    			st[i]=1;
    			group[u][gid]=i;
    			dfs(u,gid+1,cnt+1,i+1);
    			st[i]=0;
    			flag=false;
    		}
    	}
    	if(flag) //还有元素且没有办法加到其它组里
    	{
    		dfs(u+1,0,cnt,0);
    	}
    }
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;i++) cin>>a[i];
    	dfs(1,0,0,0);
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    789
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者