rt,最后一个点超时了15ms,求优化
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[70],tot = 0;
bool cmp(int x,int y) {
return x > y;
}
bool vis[70];
void dfs(int rest,int num,int aim,int small) {
if(num == 0) {
printf("%lld\n",aim);
exit(0);
}
if(rest == 0) {
dfs(aim,num - 1,aim,tot / aim - num + 1);
}
if(rest < a[n]) return;
for(int i = small;i <= n;i++) {
if(vis[i] or rest < a[i]) continue;
if(a[i] == a[i - 1] and !vis[i - 1]) continue;
vis[i] = 1;
dfs(rest - a[i],num,aim,i + 1);
vis[i] = 0;
if(rest == aim) return;
if(rest == a[i]) return;
}
return;
}
signed main() {
scanf("%lld",&n);
for(int i = 1;i <= n;i++) {
scanf("%lld",&a[i]);
tot += a[i];
}
sort(a + 1,a + n + 1,cmp);
for(int i = a[1];i <= tot;i++) {
if(tot % i == 0) {
dfs(i,tot / i,i,1);
}
}
return 0;
}