1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int s[66]; 7 int n; 8 int nextval[66]; 9 int sum; 10 int l; 11 int len; 12 bool flag; 13 bool used[66]; 14 15 void dfs(int num, int last, int m) 16 { 17 if (!m) 18 { 19 if (l == num) 20 { 21 flag = true; 22 return; 23 } 24 for (int i = 1; i <= n; i++) 25 { 26 if (!used[i]) 27 { 28 used[i] = true; 29 dfs(num + 1, i, len - s[i]); 30 used[i] = false; 31 if (flag) return; 32 break; 33 } 34 } 35 } 36 int left = last + 1; 37 int right = n; 38 int mid; 39 while (left < right) 40 { 41 mid = (right + left) / 2; 42 if (s[mid] <= m) right = mid; 43 else left = mid + 1; 44 } 45 for (int i = left; i <= n; i++) 46 { 47 if (!used[i]) 48 { 49 used[i] = true; 50 dfs(num, i, m - s[i]); 51 used[i] = false; 52 if (flag) return; 53 if (m == s[i] || m == len) return; 54 i = nextval[i]; 55 if (i == n) return; 56 } 57 } 58 } 59 60 int main() 61 { 62 cin >> n; 63 for (int i = 1; i <= n; i++) 64 { 65 cin >> s[i]; 66 if (s[i] > 50) 67 { 68 n--; 69 i--; 70 continue; 71 } 72 sum += s[i]; 73 } 74 sort(s + 1, s + n + 1, greater<int>()); 75 for (int i = n; i > 0; i--) 76 { 77 if (s[i] == s[i + 1]) nextval[i] = nextval[i + 1]; 78 else nextval[i] = i; 79 } 80 for (len = s[1]; len <= sum / 2; len++) 81 { 82 if (sum % len) continue; 83 l = sum / len; 84 flag = false; 85 used[1] = true; 86 dfs(1, 1, len - s[1]); 87 used[1] = false; 88 if (flag) 89 { 90 cout << len; 91 return 0; 92 } 93 } 94 cout << sum; 95 }
原文:https://www.cnblogs.com/thjkhdf12/p/11641091.html