我们要确定一个搜索顺序,这个搜索顺序要将所有的数归类,归为不同的互质组里。
这个顺序选择为,每次一个数要么加入之前的组,要么新成立一个组,按照这个顺序就可以得出每个数位于不同的组,不同组合,利用ans记录最小就可以得出答案。
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
typedef pair<int,string> PII;
const int N=1e2+10;
int n,m,ans;
int vis[N];
vector<int> g[N];
int a[N];
int gcb(int x,int y){
return y?gcb(y,x%y):x;
}
int check(int c,int x) {
for(int i=0; i<g[c].size(); i++) {
if(gcb(g[c][i],x)>1)return false;
}
return true;
}
void dfs(int u) {
if(u==n) {
ans=min(ans,m);
return;
}
//1、加入到之前的组
for(int i=0; i<m; i++) {
if(check(i,a[u])) {
g[i].push_back(a[u]);
dfs(u+1);
g[i].pop_back();
}
}
//2、自成一组
g[m++].push_back(a[u]);
dfs(u+1);
g[--m].pop_back();
}
int main() {
cin>>n;
ans=INF;
for(int i=0; i<n; i++) {
cin>>a[i];
}
dfs(0);
cout<<ans;
return 0;
}
这两道题本质相同,都是拿着水果去找果篮。