互质指的是两个数的最大公因数(gcd)是1。
思路:
如果a[step]能与前面的k组中某一个合为一组,就合并。否则a[step]自己成为第k+1组。如何记录同为一个组的元素呢?可以用变量存储一个组的元素的积。
代码实现:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 20
using namespace std;
int n;
int a[N];
int cnt=99999;
long long vis[N];//记录第i组中的数字的积。
long long gcd(long long a,long long b)
{if(b==0)return a;returngcd(b,a%b);
}
//k是组数,step是遍历到的第几个数字。
void dfs(int k,int step)
{if(step==n+1){if(k<cnt)cnt=k;return;}for(int i=1;i<=k;i++)if(gcd(vis[i],a[step])==1){vis[i]*=a[step];dfs(k,step+1);vis[i]/=a[step];}//第step个数不在前k组里,就放到第k+1组。 vis[k+1]*=a[step];dfs(k+1,step+1);vis[k+1]/=a[step];
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];vis[i]=1;}sort(a+1,a+1+n);dfs(1,1); cout<<cnt<<endl;return 0;
}