01背包
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
vector<int> cost;
unsigned char dp[50005];
void get_dp(int bag_size){
int i, j;
int remain;
dp[0] = 1; memset(dp+1, 0, sizeof(unsigned char)*bag_size);
for(i=1; i<=cost.size()-1; i++){
for(j=bag_size; j>=0; j--){
if(0 == j){
dp[j] = 1;
continue;
}
if(0 == dp[j]){
remain = j-cost[i];
if(remain >= 0)
dp[j] = dp[remain];
}
}
}
}
void func(){
int sum;
int i, bag_size;
sum = 0;
for(i=1; i<cost.size(); i++) sum += cost[i];
bag_size = sum/2;
get_dp(bag_size);
for(i=bag_size; i>=0; i--){
if(dp[i])
break;
}
printf("%d\n", sum-2*i);
}
int main(void){
int case_num, n, mianzhi;
//freopen("input.dat", "r", stdin);
scanf("%d", &case_num);
while(case_num--){
scanf("%d", &n);
cost.clear();
cost.push_back(0);
while(n--){
scanf("%d", &mianzhi);
cost.push_back(mianzhi);
}
func();
}
return 0;
}
01背包