题目链接
剪枝优化:
1.搜索顺序优化
2.排除等效冗余
3.一眼就看出来的优化
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 70;
bool st[N];
int a[N],n;
int sum=0,length=0;
bool dfs(int u,int len,int start)
{
if(u*length==sum)return true;
if(length==len)return dfs(u+1,0,0);
for(int i=start;i<n;i++)
{
if(st[i])continue;
if(len+a[i]>length)continue;
st[i]=true;
if(dfs(u,len+a[i],i+1))return true;
st[i]=false;
if(!len||len+a[i]==length)return false;
int j=i;
while(j<n&&a[j]==a[i])j++;
i=j-1;
}
return false;
}
int main()
{
cin>>n;
sum=0;
memset(st, 0, sizeof st);
for(int i=0;i<n;i++)cin>>a[i],sum+=a[i];
sort(a,a+n,greater<int>());
length=1;
while(1)
{
if(sum%length==0&&dfs(0,0,0))
{
cout<<length<<endl;
break;
}
length++;
}
}