ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

acwing 1118. 分成互质组(dfs搜索+剪枝)

2022-03-19 17:03:46  阅读:183  来源: 互联网

标签:剪枝 return int 样例 dfs 互质


目录

题目传送门

题目描述

给定 nn 个正整数,将它们分组,使得每组中任意两个数互质。

至少要分成多少个组?

输入格式

第一行是一个正整数 nn。

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

输出格式

一个正整数,即最少需要的组数。

数据范围

1≤n≤10

输入样例:

6
14 20 33 117 143 175

输出样例:

3

dfs剪枝搜索

分析

小猫爬山问题很像

对于每个数

  • 如果他和某一组内所有数互质,就可以将它加到这个组;然后回溯
  • 新开一个组,把这个数加到新的组

对于如何判断互质:用定义

两个数互质:就是两个数的最大公约数是1

代码

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
bool isZ(int a, int b)
{
    if(gcd(a, b) > 1) return false;
    else              return true;
}
int ans = 0x3f3f3f3f;
vector<int> h[12];
int a[12];
int n;

void dfs(int u, int k)
{
    if(k >= ans) return; // 剪枝

    if(u >= n)
    {
        ans = min(ans, k);
        return;
    }

    for(int i = 0; i < k; i++)
    {
        vector<int> tmp = h[i]; // 第k组有的所有互质的数
        bool flag = true;
        for(int j = 0; j < tmp.size(); j++)
        {
            if(!isZ(a[u], tmp[j]))
            {
                flag = false;
                break;
            }
        }

        if(flag)
        {
            h[i].push_back(a[u]);
            dfs(u+1, k);
            h[i].pop_back(); // 恢复现场
        }
    }

    h[k].push_back(a[u]);
    dfs(u+1, k+1);
    h[k].pop_back();
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];

    dfs(0, 0);

    cout << ans;
    return 0;
}

时间复杂度

参考文章

https://www.acwing.com/solution/content/10364/

标签:剪枝,return,int,样例,dfs,互质
来源: https://www.cnblogs.com/VanHa0101/p/16027047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有