这题其实是0-1背包题,但是用搜索比较好,,dfs就是考虑所有可能情况,从而得出最优解,dfs最重要的是要找到回溯的条件,即递归结束的条件。。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<cmath>
using namespace std;
int a[21];
int sum1,sum2, minx;
void dfs(int cur,int n)
{
if(cur==n) minx=min(minx,abs(sum1-sum2));//回溯条件
else{
sum1+=a[cur];
dfs(cur+1,n);
sum1-=a[cur];//回溯时要恢复以前的状态
sum2+=a[cur];
dfs(cur+1,n);
sum2-=a[cur];
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{ minx=0xfffff;
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
sum1=0;sum2=0;
dfs(0,n);
cout<<minx<<endl;
}return 0;
}