/* kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。 她想知道,最终所有取出的数的和的最小值是多少? 注:若 a\bmod k== 0amodk==0,则称 kk 是 aa 的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数 */ #include <stdio.h> #include<malloc.h> #include<limits.h> #include<math.h> int n; int min = INT_MAX; //定义最大整数 int* arr; int* rec; //用于存放 int isprime(int k) { int i = 0; for (i = 2; i <= sqrt(k); i++) { if (k % i == 0) return 0; } return 1; } void dfs(int* arr, int* rec, int index, int sum) { int i, j; if (index ==n) { // 递归退出条件,找过所有数的素因子。只有递归完所有arr元素才会到这 if (sum < min) min = sum; return; } for (i = 2; i <= arr[index]; i++) { if (arr[index] % i == 0 && isprime(i)) { //是arr[index]的素因子? int flag = 0; //是否有相同素因子的标志 for (j = 0; j < index; j++) { if (i == rec[j]) { //i在rec里面 flag = 1; break; } } if (flag) { //有相同的素因子 flag = 0; continue; } else { //没有的话继续查找 rec[index] = i; dfs(arr, rec, index + 1, sum + i); rec[index] = 0; //回溯 } } } } int main() { int i; scanf("%d", &n); arr = (int*)malloc(sizeof(int) * n); rec = (int*)malloc(sizeof(int) * n); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } dfs(arr, rec, 0, 0); if (min < INT_MAX) printf("%d", min); else printf("%d", -1); free(arr); free(rec); }