第一行输入整数
。
第二行输入
个两两不同的整数
。
若存在合法选取方案,输出最小可能和;否则输出
。
4 12 15 28 22
17
可取素因子,和为
;任意合法方案的和都不小于
。
5 4 5 6 7 8
-1
package main
/*
计算并存储每个数的所有素因子
dfs遍历所有可能
*/
import (
"fmt"
"math"
)
// 判断一个数是否为素数
func isPrime(x int) bool {
if x < 2 {
return false
}
for i := 2; i <= int(math.Sqrt(float64(x))); i++ {
if x%i == 0 {
return false
}
}
return true
}
// 获取一个数的所有素因子
func getPrimeFactors(x int) []int {
factors := []int{}
for i := 2; i <= x; i++ {
if x%i == 0 && isPrime(i) {
factors = append(factors, i)
// 跳过所有i的倍数
for x%i == 0 {
x /= i
}
}
}
return factors
}
func main() {
var n int
fmt.Scanf("%d", &n)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scanf("%d", &a[i])
}
// 为每个数获取所有可能的素因子
primeFactors := make([][]int, n)
for i, num := range a {
primeFactors[i] = getPrimeFactors(num)
}
// 尝试所有可能的素因子组合,使用回溯法
used := make([]bool, 10000) // 假设素因子不超过10000
minSum := math.MaxInt32
var backtrack func(index, sum int)
backtrack = func(index, sum int) {
if index == n {
if sum < minSum {
minSum = sum
}
return
}
for _, factor := range primeFactors[index] {
if !used[factor] {
used[factor] = true
backtrack(index+1, sum+factor)
used[factor] = false
}
}
}
backtrack(0, 0)
if minSum == math.MaxInt32 {
fmt.Println(-1)
} else {
fmt.Println(minSum)
}
}
import math
import sys
n = int(input())
nums = list(map(int, input().split()))
def is_prime(m):
if m < 2:
return False
for i in range(2, int(math.sqrt(m)) + 1):
if m % i == 0:
return False
return True
# 返回 num 的所有素因子
def prime_factor(m):
factor_list = []
for i in range(2, int(math.sqrt(m)) + 1):
if m % i == 0 and is_prime(i):
factor_list.append(i)
while m % i == 0:
m //= i
if m > 1 and is_prime(m):
factor_list.append(m)
return factor_list
# 所有素因子集合
all_factor_list = []
for num in nums:
all_factor_list.append(prime_factor(num))
# 回溯 + 剪枝
min_sum = float('inf')
used = set()
def dfs(index, current_sum):
global min_sum
if current_sum >= min_sum:
return # 剪枝
if index == n:
min_sum = min(min_sum, current_sum)
return
for factor in sorted(all_factor_list[index]):
if factor not in used:
used.add(factor)
dfs(index + 1, current_sum + factor)
used.remove(factor)
dfs(0, 0)
if min_sum == float('inf'):
print('-1')
else:
print(min_sum)
import collections
class Solution():
def __init__(self, alist, n):
self.alist = alist
self.n = n
self.res = float('+inf')
self.dic = collections.defaultdict(list)
self.no_repeat_set = set()
def is_prime(self, x):
if x <= 1:
return False
for i in range(2, x):
if x % i == 0:
return False
return True
def dfs(self, idx, s):
if idx == self.n:
self.res = min(self.res, s)
return
for prime_factor in self.dic[self.alist[idx]]:
if prime_factor not in self.no_repeat_set:
self.no_repeat_set.add(prime_factor)
self.dfs(idx+1, s+prime_factor)
self.no_repeat_set.remove(prime_factor)
def func(self):
if self.n <= 0:
return -1
for ele in self.alist:
if ele == 1:
return -1
for i in range(2, ele+1):
if self.is_prime(i) and ele % i == 0:
self.dic[ele].append(i)
if self.dic[ele] == []:
return -1
self.dfs(0, 0)
return -1 if self.res == float('+inf') else self.res
n = int(input().strip())
alist = list(map(int, input().strip().split()))
solution = Solution(alist, n)
print(solution.func()) #include <bits/stdc++.h>
using namespace std;
#define int long long
int n, a[15], sushu[15], res = 0, ans = 0x3f3f3f3f, flag = 0;
//判断是不是素数
int isprime(int x) {
for (int i = 2; i <= sqrt(x); ++i) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
void dfs(int u) {
if (u == n) {
ans = min(res, ans);
flag = 1;
return;
}
//先求出所有素因子
for (int i = 2; i <= a[u]; ++i) {
if (a[u] % i == 0 && isprime(i)) {
//满足条件,入
int f = 0;
for (int j = 0; j <= u; ++j) {
if (sushu[j] == i) {
f = 1;
}
}
if (f == 0) {
sushu[u] = i;
res += i;
dfs(u + 1);
sushu[u] = 0;
res -= i;
}
}
}
}
signed main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
dfs(0);
if (flag == 0) {
cout << -1;
return 0;
}
cout << ans;
return 0;
} #include <climits>
#include <iostream>
#include <vector>
#include<cmath>
#include<algorithm>
#include<numeric>
using namespace std;
void dfs(int x, vector<int>& su) {
int flag = 0;
int a = sqrt(x);
for (int i = 2; i <= a; i++) {
if (!(x % i)) {
dfs(x / i, su);
dfs(i, su);
flag++;
}
}
if (!flag && !count(su.begin(), su.end(), x)) {
su.push_back(x);
}
return;
}
void ddfs(int n, vector<vector<int>>& su, vector<int>& choose,vector<int>& val) {
if(choose.size()==su.size()) {
val.push_back(accumulate(choose.begin(),choose.end(),0));
return;
}
for (int i = 0; i < su[n].size(); i++) {
if (!count(choose.begin(), choose.end(), su[n][i])) {
choose.push_back(su[n][i]);
ddfs(n+1, su, choose, val);
choose.pop_back();
}
}
return;
}
int minadd(vector<vector<int>>& su) {
vector<int> choose;
vector<int> val;
ddfs(0, su, choose, val);
if (val.empty()) return -1;
return *min_element(val.begin(), val.end());
}
int main() {
int n = 0, m = 0;
cin >> n;
vector<vector<int>> su(n, vector<int>(0));
for (int i = 0; i < n; i++) {
cin >> m;
dfs(m, su[i]);
}
cout << minadd(su) << endl;
return 0;
} package main
import (
"fmt"
"math"
)
func main() {
var n int
fmt.Scan(&n)
arr:=make([][]int,n)
var x int
for i:=0;i<n;i++{
fmt.Scan(&x)
tmp:=make_arr(x)
arr[i]=tmp
}
// fmt.Printf("%v\n",arr)
min:=math.MaxInt32
vis:=map[int]bool{}
var dfs func(int,int)
dfs=func(j int,sum int){
if j==n{
if sum<min{
min=sum
}
return
}
for i:=0;i<len(arr[j]);i++{
x:=arr[j][i]
if _,ok:=vis[x];ok{
continue
}
sum+=x
vis[x]=true
dfs(j+1,sum)
sum-=x
delete(vis,x)
}
}
dfs(0,0)
if min==math.MaxInt32{
fmt.Println(-1)
return
}
fmt.Println(min)
}
func make_arr(x int)[]int{
ans:=[]int{}
for i:=2;i<=x;i++{
if x%i==0&&check(i){
ans=append(ans,i)
}
}
return ans
}
func check(x int)bool{
for i:=2;i<x;i++{
if x%i==0{
return false
}
}
return true
}