直接暴力搜索会超时,所以要进行优化。优化的方法是,将物品分成两堆。首先,记录下第一堆中物品价值累加可能出现的值,之后在对这个数组排序。之后,在对第二堆进行搜索。对于每种状态,在数组中找出一个值使得两个数值相加越接近sum。
#include<bits/stdc++.h>
using namespace std;
int ans,cnt,m1,m2,sum,half,a[100],b[100],vis[1<<18];
void dfs1(int now ,int s)
{
if(now==m1)
{
vis[cnt++]=s;
return ;
}
dfs1(now+1,s);
dfs1(now+1,s+a[now]);
}
void dfs(int now,int s)
{
if(now==m2)
{
int k=lower_bound(vis,vis+cnt,half-s)-vis;
if(k<cnt)
ans=min(ans,abs(sum-s-vis[k]-s-vis[k]));
return ;
}
dfs(now+1,s);
dfs(now+1,s+b[now]);
}
int main()
{
int _,i,n;
scanf("%d",&_);
while(_--)
{
scanf("%d",&n);
m1=n/2;
m2=n-m1;
sum=0;
for(i=0; i<m1; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
for(i=0; i<m2; i++)
{
scanf("%d",&b[i]);
sum+=b[i];
}
cnt=0;
half=sum/2;
ans=sum;
dfs1(0,0);
sort(vis,vis+cnt);
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}