POJ1011问题TLE,求大老回答
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
const int maxn=100+10;
int n,mx,sum,nl,k;
int a[maxn],nxt[maxn];
bool vis[maxn];
inline bool cmp(int x1,int y1){
return x1>y1;
}
inline bool dfs(int len,int x,int num){
if(num==k)return true;
for(int i=x;i<=k;i++){
if(vis[i]||(i>1&&!vis[i-1]&&!(a[i]^a[i-1])))continue;
vis[i]=true;
if(len+a[i]<nl){
if(dfs(len+a[i],i+1,num+1))return true;
}
else if(len+a[i]==nl){
if(dfs(0,1,num+1))return true;
}
vis[i]=false;
if(len==0)break;
}
return false;
}
int main(){
while(~scanf("%d",&n)){
if(n==0)break;
sum=0,mx=0,k=0;
for(int i=1;i<=n;i++){
int b;
scanf("%d",&b);
if(b>50||b==0)continue;
a[++k]=b;
sum+=b;
mx=max(mx,b);
}
//printf("mx %d sum %d\n",mx,sum);
sort(a+1,a+k+1,cmp);
/*
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n");
*/
/*
memset(nxt,0,sizeof(nxt));
nxt[k]=k;
for(int i=k-1;i>=1;i--){
if(a[i]==a[i+1])nxt[i]=nxt[i+1];
else nxt[i]=i;
}
*/
int ans=0;
for(int i=mx;i<=(sum>>1)+1;i++){
if(sum%i!=0)continue;
nl=i;
memset(vis,false,sizeof(vis));
if(dfs(0,1,0)){
ans=nl;
break;
}
}
if(ans==0)ans=sum;
printf("%d\n",ans);
}
return 0;
}