深搜超时了,但是http://blog.csdn.net/hearthougan/article/details/21940999这个题,却可以!
只有利用0-1背包的思想来求解了;
0-1解法:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 1010;
int MAX(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int T, m, arr[MAXN];
int dp[100010];
int total;
cin>>T;
while(T--)
{
cin>>m;
memset(dp, 0, sizeof(dp));
memset(arr, 0, sizeof(arr));
total = 0;
for(int i = 0; i < m; ++i)
{
cin>>arr[i];
total += arr[i];
}
int half = total/2;
for(int i = 0; i < m; ++i)
{
for(int j = half; j >= arr[i]; --j)
{
dp[j] = MAX(dp[j - arr[i]]+arr[i], dp[j]);
}
}
cout<<total - 2*dp[half]<<endl;
}
return 0;
}
深搜超时:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1010;
int arr[MAXN];
int Minnum ;
int m;
int total;
int fabs(int a)
{
return a > 0 ? a : (-a);
}
void DFS(int cur, int sum)
{
if(cur == m)
return ;
int t = fabs(total - sum - sum);
if(t < Minnum)
Minnum = t;
DFS(cur+1, sum);
DFS(cur+1, sum + arr[cur]);
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
cin>>m;
total = 0;
Minnum = 0xffffff;
memset(arr, 0, sizeof(arr));
for(int i = 0; i < m; ++i)
{
cin>>arr[i];
total += arr[i];
}
DFS(0, 0);
if(m == 0)
cout<<"0"<<endl;
else
cout<<Minnum<<endl;
}
return 0;
}