此题的数据交水,故既可以用DP做,也可以用DFS做
DFS记得剪枝,不然会爆站
#include <stdio.h>
#include <string.h>#include <algorithm>
using namespace std;
int minn;
int w[26];
int mark[26];
int n;
int sum;
int half;
int xxx(int a)
{
return a>0?a:-a;
}
int cmp(int a,int b)
{
return a>b;
}
void dfs(int tot,int i) //此处的i与sort一起,用于减少运算,较小的数不行,则较大的数不必dfs
{
int cha=sum-2*tot;
if(xxx(cha)<minn)
minn=xxx(cha);
if((xxx(cha)>=minn)&&tot>half) //起初这里错了一发,如果min被更新为较小值,可能下一组连第一个数都接受不进来,所以要判断是否超过half
return ;
while(i<n)
{
if(mark[i]==1)
{
i++;
continue;
}
mark[i]=1;
dfs(tot+w[i],i+1);
mark[i]=0;
i++;
}
return ;
}
int main()
{
while(scanf("%d",&n)!=-1)
{
sum=0;minn=100000;
memset(mark,0,sizeof(mark));
for(int i=0;i<n;i++)
{
scanf("%d",&w[i]);
sum+=w[i];
}
sort(w,w+n,cmp);
half=sum/2;
dfs(0,0);
printf("%d\n",minn);
}
return 0;
}