87pts求助!!!
查看原帖
87pts求助!!!
965313
youth191954楼主2024/5/19 10:29
#include <bits/stdc++.h>
using namespace std;
int line[105],len,nxt[105],end1,sum,n,iA,in,maxi,cha,cun;
bool vis[105];
bool cmp(const int a,const int b){
   return a>b;
}
bool perm(int pre,int fromp){
   int i;
   if(pre%len==0){
   	if(sum-pre==len) return true;
   	for(i=2;i<=end1 && vis[i];i++) ;
   	vis[i]=true;
   	if(perm(pre+line[i],2)) return true;
   	vis[i]=false;
   }
   else {
   		for(;fromp<=end1;fromp++){
      	if(!vis[fromp])
      	{
      		if(pre%len+line[fromp]<=len)
      		{
      			vis[fromp]=true;
  				if(perm(pre+line[fromp],fromp)) return true;
   			vis[fromp]=false;
   			if(pre%len+line[fromp]==len) return false;
   		}
   		fromp=nxt[line[fromp]];
   	}
   }
   }
   return false;
}
int main(){
   scanf("%d\n",&n);
   for (iA=1;iA<=n;iA++){
   	scanf("%d",&in);
   	if(in<=50){
   		maxi=max(maxi,in);
   		sum+=in;
   		line[iA-cha]=in;
   	}
   	else cha++;
   }
   sort(line+1,line+n-cha+1,cmp);
   for(iA=1;iA<=n-cha;iA++)
   	if(line[iA]!=cun){
   		nxt[cun]=iA-1;
   		cun=line[iA];
   	}
   end1=n-cha;vis[1]=true;nxt[line[end1]]=end1;
   for(len=maxi;len<=sum/2;len++)
   {
   	if(sum%len!=0) continue;
   	if(perm(line[1],2)) break;
   }
   if(len>sum/2) cout<<sum;
   else cout<<len;
   return 0;
}
2024/5/19 10:29
加载中...