分成互质组 DFS
1118. 分成互质组
给定 n 个正整数,将它们分组,使得每组中任意两个数互质。
至少要分成多少个组?
输入格式
第一行是一个正整数 n。
第二行是 n 个不大于10000的正整数。
输出格式
一个正整数,即最少需要的组数。
数据范围
1≤n≤10
输入样例:
6
14 20 33 117 143 175
输出样例:
3
思路:
利用最大公因数判断互质,然后对当前组序号,组内元素数量,搜索过的总个数和当前组搜索的元素序号进行搜索。
代码:
#include<iostream>
using namespace std;
const int N = 11;
int res = N, n, m;
int a[N];
bool st[N];
int g[N][N];
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
bool check(int group[], int gc, int i) {
for (int j = 0; j < gc; ++j) {
if (gcd(a[group[j]], a[i]) > 1) // 最大公因数大于1便不互质
return false;
}
return true;
}
// u为最后一组的组序号, gc为当前组的组内数量,tc为搜索过的总个数, start为当前组搜索的数的序号
void dfs(int u, int gc, int tc, int start) {
if (u >= res) return; // 剪枝
if (tc == n) res = u; // 都搜完了就更新答案
bool flag = true;
for (int i = start; i < n; ++i) {
if (st[i] || !check(g[u], gc, i)) continue;
st[i] = true;
g[u][gc] = i;
// 继续搜索,组内数量+1,总数+1,序号+1
dfs(u, gc + 1, tc + 1, i + 1);
st[i] = false;
flag = false;
}
// 新开一组,最后一组序号+1,当前组内数量为0,总数不变,当前组搜索的数的序号为0
if (flag) dfs(u + 1, 0, tc, 0);
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) cin >> a[i];
dfs(1, 0, 0, 0);
cout << res << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效