#include<bits/stdc++.h>
#include <vector>
using namespace std;
#define int long long
const int MAX_SIZE=1000;
vector<bool> pre(MAX_SIZE,true);
vector<int>prenum;
int allans=-1;
void pre_make(){
for(int i=2;i<MAX_SIZE;i++){
if(pre[i]){
for(int j=2;j*i<MAX_SIZE;j++){
pre[i*j]=false;
}
}
}
for(int i=2;i<MAX_SIZE;i++){
if(pre[i]){
prenum.push_back(i);
}
}
}
void dfs(vector<int>m,set<int>ans,int pos){
if(pos==m.size()){
int t=0;
for(auto it:ans){
t+=it;
}
if(allans==-1){
allans=t;
}else if(allans>t){
allans=t;
}
}
int t=m[pos];
for(int i=0;prenum[i]<=t;i++){
if(t%prenum[i]==0){
if(ans.find(prenum[i])==ans.end()){
ans.insert(prenum[i]);
dfs(m,ans,pos+1);
ans.erase(prenum[i]);
}
}
}
}
signed main(){
pre_make();
int n;
cin>>n;
vector<int>m;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
m.push_back(temp);
}
set<int>ans;
dfs(m,ans,0);
cout<<allans<<endl;
}
// 64 位输出请用 printf("%lld")
首先找出题目要求范围内所以所有素数,本代码采用欧拉筛法收集素数,再用dfs对每个数进行枚举如果符合条件在检测ans(set)里是否有该数然后进行递归即可

京公网安备 11010502036488号