求助才得12分,有没有书上来的,思路和书上一样
min(a,b){return a<b?a:b;}
cmp(int*a,int*b){return*a-*b;}
n,a[65],sum,len[51],nxt[51];
void dfs(k,t,g,i) { //k not done, this left t, smaller than g, s is the length of each
if(t==0) {dfs(k-1,i,a[n],i);return;}
if(k==0) exit(printf("%d",i)&0);
g=min(t,g);
while(g&&!len[g]) --g;
while(g){
if(len[g]) {
--len[g],dfs(k,t-g,g,i),++len[g];
if(g==t||t==i) break;
}
g=nxt[g];
}
}
main(){
scanf("%d",&n);
for(int i=0;i<n;++i)scanf("%d",a+i),sum+=a[i],++len[a[i]];
qsort(a,n,4,cmp);
nxt[*a]=0;for(int i=n-1;i;--i){
if(a[i]!=a[i-1])nxt[a[i]]=a[i-1];
}
for(int i=a[n-1];i<=sum/2;++i){
if(sum%i==0) dfs(sum/i,i,a[n],i);//搜完一遍减一次,如果sum/i=1,则就是1遍,应当是这样
}
printf("%d",sum);
}