思路来自大牛的代码和题解。。不多说了,话说这题的思路真的巧妙
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int T, n;
scanf("%d", &T);
vector<int> V, temp;
set<int> S1, S2;
while (T--)
{
scanf("%d", &n);
V.clear();
int p, sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &p);
V.push_back(p);
sum += p;
}
S1.clear();
S2.clear();
S1.insert(0);
S2.insert(0);
int half = sum / 2;
for (int i = 0; i < n / 2; i++)
{
temp.clear();
for (set<int>::iterator it = S1.begin(); it != S1.end(); it++)
temp.push_back(*it + V[i]);
for (size_t t = 0; t < temp.size(); t++)
if (temp[t] <= half)
S1.insert(temp[t]);
else
break;
}
for (int i = n / 2; i < n; i++)
{
temp.clear();
for (set<int>::iterator it = S2.begin(); it != S2.end(); it++)
temp.push_back(*it + V[i]);
for (size_t t = 0; t < temp.size(); t++)
if (temp[t] <= half)
S2.insert(temp[t]);
else
break;
}
int minn = half;
for (set<int>::iterator it = S1.begin(); it != S1.end(); it++)
{
int remain = half - *it;
set<int>::iterator pt = S2.upper_bound(remain);
pt--;
if (remain - *pt < minn)
minn = remain - *pt;
}
printf("%d\n", sum - 2 * (half - minn));
}
return 0;
}