第一行输入整数
。
第二行输入
个两两不同的整数
。
若存在合法选取方案,输出最小可能和;否则输出
。
4 12 15 28 22
17
可取素因子,和为
;任意合法方案的和都不小于
。
5 4 5 6 7 8
-1
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 }