题目描述
给定 n n n个正整数,将它们分组,使得每组中任意两个数互质。
至少要分成多少个组?
输入格式
输出格式
数据范围
1 ≤ n ≤ 10 1≤n≤10 1≤n≤10
输入样例
6
14 20 33 117 143 175
输出样例
3
DFS
本题的搜索顺序比较比较难想,此外实现代码有很多细节。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
vector<int> mat[N];
bool st[N];
int arr[N];
int res = 9;
int n;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
bool check(int target, vector<int> & v) {
for (int i = 0; i < v.size(); ++ i) {
if (gcd(target, v[i]) > 1) return false;
}
return true;
}
void dfs(int idx, vector<int> & v, int start, int cnt) {
// 当前idx组,这个组的元素在v中,目前消耗了cnt个数字
if (idx >= res) return ; // 剪枝吧
if (cnt == n) {
res = min(res, idx);
return ;
}
bool find = false;
for (int i = start; i < n; ++ i) {
if (!st[i] && check(arr[i], v)) {
st[i] = true;
v.push_back(arr[i]);
dfs(idx, v, i + 1, cnt + 1);
v.pop_back();
st[i] = false;
find = true; //可以拼凑
}
}
if (!find) {
dfs(idx + 1, mat[idx + 1], 0, cnt);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++ i)
cin >> arr[i];
dfs(0, mat[0], 0, 0);
cout << res + 1 << endl;
return 0;
}