题目:给定m个硬币分成两组,求两组和的最小差值。
分析:dp、背包。经典01背包模型,把硬币看成体积和价值相同的物品即可,利用背包求出总和一半的价值的容量能取得的最大价值,然后sum-2*f[sum/2]即为结果。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int coin[ 105 ];
int f[ 50005 ];
int main()
{
int n,m;
while ( scanf("%d",&n) != EOF )
for ( int t = 1 ; t <= n ; ++ t ) {
scanf("%d",&m);
int sum = 0;
for ( int i = 1 ; i <= m ; ++ i ) {
scanf("%d",&coin[i]);
sum += coin[i];
}
memset( f, 0, sizeof(f) );
for ( int i = 1 ; i <= m ; ++ i )
for ( int j = sum/2 ; j >= coin[i] ; -- j )
if ( f[j] < f[j-coin[i]]+coin[i] )
f[j] = f[j-coin[i]]+coin[i];
printf("%d\n",sum-2*f[sum/2]);
}
return 0;
}