挺有意思的一道题
#include<bits/stdc++.h> using namespace std; int a[1000],cnt,ans=0x3f3f3f3f; vector<int> s[1100]; map<int,bool> mp; bool is_Prime(int x){ if(x==2||x==3)return true; if(x%6!=1&&x%6!=5)return false; for(int i=5;i<=sqrt(x);i+=6){ if(!(x%i)||!(x%(i+2)))return false; }return true; } void dfs(int num,int n,int sum){ if(num==n){ ans=min(ans,sum); } for(int i=0;i<s[num].size();i++){ if(!mp[s[num][i]]){ mp[s[num][i]]=true; dfs(num+1,n,sum+s[num][i]); mp[s[num][i]]=false; } } } int main(){ for(int i=2;i<=1000;i++) if(is_Prime(i)) a[cnt++]=i; a[cnt]=0x3f3f3f3f; int n,i=0; cin>>n; for(int i=0;i<n;i++){ int x; cin>>x; int j=0; while(a[j]<=x){ if(x%a[j]==0){ s[i].push_back(a[j]); } j++; } } //int num=0; dfs(0,n,0); if(ans==0x3f3f3f3f)cout<<-1; else cout<<ans; }