第一行输入整数
。
第二行输入
个两两不同的整数
。
若存在合法选取方案,输出最小可能和;否则输出
。
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)
}
}
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
}