链接:点我
就是给你银币让你平衡。。。输出最小相差多少。。。。说实话题不明白怎么做。。但是AC还是没啥问题的。。。。就跟着感觉写啊写啊。。然后就AC了。。。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn = 50005;
int main()
{
int n;
scanf("%d", &n);
while (n--)
{
int m, sum = 0, dp[maxn], coin[105];
int i, j;
scanf("%d", &m);
for (i=0; i<m; i++)
{
scanf("%d", &coin[i]);
sum += coin[i];
}
int mid = sum / 2;
memset(dp, 0, sum * sizeof(dp[0]));
for (i=0; i<m; i++)
{
for (j=sum; j>=coin[i]; j--)
{
if (abs(sum - 2*dp[j]) > abs(sum - 2*(dp[j-coin[i]] + coin[i])))
dp[j] = dp[j-coin[i]] + coin[i];
}
}
int min = 1e9;
for (i=0; i<=sum; i++)
if (min > abs(sum - 2*dp[i]))
min = abs(sum - 2*dp[i]);
printf("%d\n", min);
}
return 0;
}