这道题目要求给定一组数据,选出最多个数使数字两两互质,数据的个数小于14个。
对于这么小的范围,暴力解肯定能过。
用0.1表示是否选该数。
则一共有2^n次选法,遍历即可。
以下为代码
#include<iostream> #include<queue> #include<string> #include<cstring> #include<map> #include<algorithm> #include<cmath> using namespace std; long long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b); } int a[15]; int b[15]; bool sop(int k){ for(int i=0;i<k-1;i++) for(int j=i+1;j<k;j++) if(gcd(b[i],b[j])!=1) return false; return true; } int main(){ int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; int k=pow(2,n)-1; int maxn=0; for(int i=0;i<=k;i++){ int z=i; int num=0; int sum=0; while(z){ if(z&1)b[sum++]=a[num]; z>>=1; num++; } if(sop(sum)){ if(sum>maxn) maxn=sum; } } cout<<maxn<<endl; } return 0; }
如此就好