最后一个点TLE了啊
本蒟蒻把所有可以想到的剪枝方法都用上了,还可以怎么优化?
#include <bits/stdc++.h>
using namespace std;
int N,a[80],book[80],maxn,sum,len;
bool cmp(int x,int y)
{
return x>y;
}
bool dfs(int cnt,int rest,int now)
{
if(cnt==sum/len)
{
return true;
}
if(rest==0)
{
return dfs(cnt+1,len,1);
}
for(int i=now;i<=N;i++)
{
if(!book[i]&&a[i]<=rest)
{
book[i]=1;
if(dfs(cnt,rest-a[i],i+1))
{
return true;
}
book[i]=0;
if(rest==len||a[i]==rest)
{
return false;
}
while(a[i]==a[i+1])
{
i++;
}
}
}
return false;
}
int main()
{
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>a[i];
maxn=max(maxn,a[i]);
sum+=a[i];
}
sort(a+1,a+N+1,cmp);
for(len=maxn;len<=sum;len++)
{
if(sum%len==0)
{
if(dfs(0,len,1))
{
cout<<len;
break;
}
}
}
return 0;
}