题目描述:
给定 $ n $ 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
数据范围:
$ 1\le n \le 10,1\le a_i \le 10^4 $
题解:
因为数据范围很小,只有 $ 10 $ ,所以直接爆搜。
使用 DFS
进行搜索,假设有若干组,对每一组进行访问,如果可以加入,则可以加入,或者开辟新的一组。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| using namespace std; using namespace FAST_IO; const ll mod = 1e9 + 7; const int INF = 0x3f3f3f3f; const ll INF_LL = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-5; const int maxn = 1e3 + 10; const int maxm = 1e5 + 10; int t, n, m, k; int a[maxn]; int ans; vector<int> g[maxn]; int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } void dfs(int step, int cnt) { if (step == n + 1) { ans = min(ans, cnt); return; } for (int i = 1; i <= cnt; i++) { bool flag = true; for (int j = 0; j < g[i].size(); j++) { int x = gcd(a[step], g[i][j]); if (x != 1) { flag = false; break; } } if (flag) { g[i].push_back(a[step]); dfs(step + 1, cnt); g[i].pop_back(); } }
g[++cnt].push_back(a[step]); dfs(step + 1, cnt); g[cnt--].pop_back(); }
int main() {
#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif read(n); for (int i = 1; i <= n; i++) { read(a[i]); } ans = INF; dfs(1, 0); printf("%d\n", ans); return 0; }
|