分成互质组(dfs)

【题目描述】
给定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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值