HDU 1171 Big Event in HDU

这是一道多重背包的题目;

题意:有N那种物件,每种物件有个重量与个数;

求A要般的重量不比B的轻,但要使他们的重量只差最小;

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void Completepack( int value, int sum ,int f[] )
{
for( int i = value ; i<= sum ; i++ )
if( f[i] < f[i-value] + value )
f[i] = f[i-value] + value;
}
void ZeroOnepack( int value, int n, int sum , int f[] )
{
int t = value * n;
for( int i = sum ; i>= t ; i-- )
{
if( f[i] < f[i-t] + t )
f[i] = f[i-t] + t;
}
}
int DP( int sum , int n ,int value[] , int num[] )
{
int f[150000] = {0};
for( int i = 0; i< n ; i++ )
{
if( value[i]*num[i]>=sum )
Completepack( value[i], sum , f );
else
{
int k = 1 ;
while( k <= num[i] )
{
ZeroOnepack( value[i] , k ,sum , f );
num[i] -= k;
k<<=1;
}
ZeroOnepack( value[i] , num[i] ,sum ,f );
}
}
return f[sum];
}
int main( )
{
int n,value[54],num[54],sum;
while( scanf( "%d",&n ),n>0 )
{
sum = 0;
for( int i = 0 ; i < n ; i++ )
{
scanf( "%d%d",&value[i] , &num[i] );
sum += value[i]*num[i];
}
int t =DP( sum>>1 ,n , value , num );
printf( "%d %d\n",sum - t , t );
}
return 0;
}

 

posted @ 2012-03-04 19:44  wutaoKeen  阅读(171)  评论(0编辑  收藏  举报