- 题目
- 题解(43)
- 讨论(12)
- 排行
中等 通过率:43.74% 时间限制:1秒 空间限制:256M

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
kotori 拿到 nn 个互不相同 的正整数 a1,a2,...,ana1,a2,...,an。她要从每个 aiai 中选出一个素因子 pipi,要求所有选出的素因子两两不同,即 pi≠pj (i≠j)pi=pj(i=j)。
若无法满足要求输出 −1−1;否则输出所有选出的素因子之和 ∑i=1npii=1∑npi 的最小可能值。
输入描述:
第一行输入整数 n(1≦n≦10)n(1≦n≦10)。
第二行输入 nn 个两两不同的整数 ai(2≦ai≦1000)ai(2≦ai≦1000)。
输出描述:
若存在合法选取方案,输出最小可能和;否则输出 −1−1。
示例1
输入:
4
12 15 28 22
复制输出:
17
复制说明:
可取素因子 [3,5,7,2][3,5,7,2],和为 1717;任意合法方案的和都不小于 1717。
示例2
输入:
5
4 5 6 7 8
复制输出:
-1
cpp
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1010];//正整数的值
int mi=1e9;
//判断是否为质数
bool primer(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
void dfs(int x,set<int> s,int temp){
if(x==n){
mi=min(mi,temp);
return;
}
for(int i=2;i<=a[x];i++){
if(a[x]%i==0 && primer(i)&&!s.count(i)){
s.insert(i);
dfs(x+1,s,temp+i);
s.erase(i);
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
set<int> s;
dfs(0,s,0);
if(mi==1e9)cout<<-1;
else cout<<mi;
return 0;
}