AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 1118. 分成互质组

作者: 作者的头像   67ovo ,  2022-08-05 10:30:56 ,  所有人可见 ,  阅读 3


0


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N=15;
int n;
int a[N];
vector<int>prime[N];//二维数组想取出一维的长度,用vector
int ans=30;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
bool check(int a,int b)
{
    if(gcd(a,b)>1)return false;
    return true;
}
void dfs(int u,int group)//当前的数,当前的组数
{
    if(group>=ans)return;//求最小值可以剪枝
    if(u==n)
    {
        ans=min(ans,group);
        return ;
    }

    for(int i=0;i<group;i++)
    {
        bool flag=true;
        for(int j=0;j<prime[i].size();j++)
        {
            if(!check(a[u],prime[i][j]))
            {
                flag=false;
                break;
            }
        }
        if(flag)//能加就加
        {
            prime[i].push_back(a[u]);
            dfs(u+1,group);
            prime[i].pop_back();
        }
    }
     //另开新组
    prime[group].push_back(a[u]);
    dfs(u+1,group+1);
    prime[group].pop_back();

}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    dfs(0,0);
    cout<<ans<<endl;

    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息