01背包问题,列举所有的分配可能,然后求两人钱相差最少的值。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 105;
const int maxm = 50005;
bool dp[maxm];
int cent[maxn];
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
int m,sum=0;
scanf("%d",&m);
for(int i=0; i<m; ++i){
scanf("%d",¢[i]);
sum += cent[i];
}
memset(dp,false,sizeof(dp));
dp[0] = true;
for(int i=0; i<m; ++i)
for(int j=sum; j>=0; --j)
if(dp[j])
dp[j+cent[i]] = true;
for(int i=sum/2; i>=0; --i)
if(dp[i]){
printf("%d\n",sum-2*i);
break;
}
}
return 0;
}