分成互质组

分成互质组

DFS 做法

1.跳出条件

(1). 当当前遍历数字越界时,跳出

(2). 当当前答案比原答案大于等于时,跳出

2.DFS 递归

将这一个数放到每一组里去判断是否与里面的数字两两互质,如果行,就放入该组里。

​ 然后递归 ——> 回溯

如果全部都不行就新开一个组

#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 15; int n, a[N], cnt, ans = N; vector<int> p[N], aw[N]; // 计算a, b的最大公约数 int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } // 判断x是否与里面的数字两两互质 bool check(int x, int i) { for(int j = 0; j < p[i].size(); j ++ ) if(gcd(x, p[i][j]) > 1) return false; return true; } // 对n个数据进行搜索 void dfs(int u) { if(cnt >= ans) return; if(u > n) { for(int i = 0; i < n; i ++ ) vector<int>().swap(aw[i]); for(int i = 0; i < cnt; i ++ ) for(int j = 0; j < p[i].size(); j ++ ) aw[i].push_back(p[i][j]); ans = cnt; return; } // 遍历cnt个数据 for(int i = 0; i < cnt; i ++ ) { // 将a[u]放到每一组里去判断是否与里面的数字两两互质 if(check(a[u], i)) { // 将a[u]添加到p[i]中 p[i].push_back(a[u]); // 递归搜索 dfs(u + 1); // 回溯 将a[u]从p[i]中移除 p[i].pop_back(); } } //如果与所有的都不能兼容 // 将a[u]添加到p[cnt]中 p[cnt ++ ].push_back(a[u]); // 递归搜索 dfs(u + 1); // 回溯 将a[u]从p[cnt]中移除 p[-- cnt].pop_back(); } int main() { cin >> n; for(int i = 1; i <= n; i ++ ) cin >> a[i]; // 对n个数据进行搜索 dfs(1); cout << ans << endl; // 遍历ans个数据 for(int i = 0; i < ans; i ++ ) { // 遍历aw[i]中的每一个数据 for(int j = 0; j < aw[i].size(); j ++ ) cout << aw[i][j] << ' '; cout << aw[i][j] <<''; cout << endl; } return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17499347.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示