这题真不会 主要是不知道怎么搜 dfs那怎么写 ;
一组中的数两两互质,则
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#include<iomanip>
#include <bits/stdc++.h>
/***************************************/
#define ll long long
#define int64 __int64
#define PI 3.1415927
#define INF 99999
const int maxn = 2010;
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
int n;
int vis [20];
int gcd(int a,int b) {
return a%b?gcd(b,a%b):b;
}
int a[20];
int ans=INF;
void dfs(int cur,int cnt) //cnt个集合数, cur当前递归层数
{
if(cur==n+1)
{
if(ans>cnt)ans=cnt;
return ;
}
for(int i=1;i<=cnt;i++)
{
if(gcd(vis[i],a[cur])==1)//a[step]与当前集合范围内数据互质的处理
{
vis[i]*=a[cur];
dfs(cur+1,cnt);
vis[i]/=a[cur];
}
}
vis[cnt+1]*=a[cur];
dfs(cur+1,cnt+1);
vis[cnt+1]/=a[cur];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{cin>>a[i];vis[i]=1;
}
sort( a+1,a+n+1);
dfs(1 ,1);
cout<<ans;
return 0;
}
任意一个数与其中两数的积互质 学到了