这道题是将一定量的硬币分给两个人,让两个人分到的数目尽量的平均,首先的最简单的分法是
一个人拿掉全部的,另一个没拿,所以f[0] = true;根据这种情况来推的话,我们可以将所有可能的
出现的硬币组成的钱数判断出来,f[j - coin[i]] = true;则f[j] = true;时间复杂度是O( m * C),将
所有的可能值都置为true,然后从平均值开始判断就可以找到其中一个人拿到的钱数,他们俩的差值就很
容易得出了。
#include<cstdio>
#include<cstring>
#define MAXN 105
int coin[MAXN];
bool f[MAXN * 500];
int main()
{
int cas;
scanf( "%d", &cas);
while( cas --)
{
int m, C = 0;
scanf( "%d", &m);
memset( f, false, sizeof f);
for( int i = 0; i < m; i ++)
{
scanf( "%d", &coin[i]);
C += coin[i];
}
f[0] = true;
for( int i = 0; i < m; i ++)
{
for( int j = C; j >= coin[i]; j --)
{
if( f[j - coin[i]])
f[j] = true;
}
}
int div;
for( int i = C / 2; i >= 0; i --) //C为奇数也没错,因为奇数不可能均分
{
if( f[i]) {
div = i;
break;
}
}
int ans = C - 2 * div; //C >= 2*div
printf( "%d\n", ans);
}
return 0;
}
浙公网安备 33010602011771号