题目大意:hdu的计算机要分成两个学院,现在有n种物品,价值为ai的有bi个,要求把这些东西分成价值总和最为接近的两份,如果不能平分,大的在前面。
#include <iostream>
using namespace std;
int V[51];
int M[51];
int bst[125005];
int main ()
{
int N;
while ( scanf ( "%d",&N ), N > 0 )
{
int sum = 0;
for ( int i = 1; i <= N; ++ i )
{
scanf ( "%d%d",&V[i], &M[i] );
sum += V[i] * M[i];
}
int total = sum;
sum /= 2;
memset ( bst, 0 , sizeof ( bst ) );
for (i = 1; i <= N; ++ i )
{
for ( int j = 1; j <= M[i]; ++ j )
{
for ( int k = sum; k >= V[i] ; k -= V[i] )
{
if ( bst[ k - V[i] ] + V[i] > bst[k] )
{
bst[k] = bst[ k - V[i] ] + V[i] ;
}
}
}
}
int other = total - bst[sum];
if ( other > bst[sum] )
{
swap ( other, bst[sum] );
}
printf ( "%d %d\n", bst[sum], other );
}
return 0;
}