求出所有的组合就行。
if(a[j-m[i]) a[j] = 1;
常用到的递推式求所有可能~~
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <limits.h>
#include <queue>
#include <stack>
using namespace std;
int main()
{
bool a[50010];
int i,j,m[110];
int cas,n,sum;
scanf("%d",&cas);
while(cas --)
{
scanf("%d",&n);
sum = 0;
for(i = 0;i < n;i ++) {scanf("%d",&m[i]);sum+=m[i];}
memset(a,0,sizeof(a));
a[0] = 1;
for(i = 0;i < n;i ++)
{
for(j = sum;j >= m[i];j --)
{
if(a[j-m[i]]) a[j] = 1;
}
}
int ans;
for(i = sum/2;i >= 0;i --)
{
if(a[i]) {ans = i;break;}
}
printf("%d\n",sum-2*ans);
}
}