最好把往后跳的步骤预处理一下。具体参见第一篇题解,楼主讲的非常详细。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n, m;
int a[1000], ne[1000];
bool vis[1000];
int sum = 0, maxa = 0;
bool cmp(int a, int b) {
return a > b;
}
inline bool dfs(int num, int y, int last) {
if (num * m == sum) return true;
if (y == m) return dfs(num + 1, 0, 0);
for (int i = last; i < n; i ++) {
if (vis[i] == false && a[i] <= m - y) {
vis[i] = true;
if (dfs(num, y + a[i], i + 1)) return true;
vis[i] = false;
if (y == 0) return false;
if (a[i] == m - y) return false;
// int j = i;
// while (a[j] == a[i] && j < n) j ++;
// i = j - 1;
i = ne[a[i]];
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> a[i];
sum += a[i];
maxa = max(maxa, a[i]);
}
stable_sort(a, a + n, cmp);
for (int i = 0; i < n; i ++) {
if (a[i] != a[i + 1]) ne[a[i]] = i;
}
for (int i = maxa; i <= sum; i ++) {
if (sum % i == 0) {
m = i;
memset(vis, 0, sizeof vis);
if (dfs(0, 0, 0)) {
cout << i << '\n';
break;
}
}
}
return 0;
}