爆搜,我觉得我的应该更优,可不行,不知为什么,就看了题解
加了剪枝
1.如果不行,比他大的也不行。
2.如果第一个不行剩下的都不行
3.相同的不行
#include<cstdio>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int cmp(const int a,const int b)
{
return a>b;
}
int n,s,x[1999],vis[1999],maxn,ans,i,tot;
int dfs(int w,int q,int p){
if(p==tot)
{
return 1;
}
if(w==0)
{
if(dfs(i,1,p+1)) return 1; ;
}
for(int j=q;j<=n;j++)
{
if(!vis[j]&&x[j]<=w)
{
vis[j]=1;
if(dfs(w-x[j],j+1,p))return 1;
vis[j]=0;
if(w==x[j]||w==i) break;
while(x[j+1]==x[j])j++;
}
}
return 0;
}
int main()
{
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
scanf("%d",&x[j]);
if(x[j]<=50)
{
maxn=max(maxn,x[j]);
s+=x[j];
}
else n--,j--;
}
sort(x+1,x+n+1,cmp);
for(i=maxn;i<=s;i++)
if(s%i==0)
{
tot=s/i;
if(dfs(i,1,0))
{
printf("%d",i);
return 0;
}
}
}