#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 260007
using namespace std;
int dp[MAX];
int c[1007];
int v[1007];
int main ( )
{
int n;
while ( ~scanf ( "%d" , &n )&& n >= 0 )
{
int sum = 0;
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%d%d" , &c[i] , &v[i] );
sum += c[i]*v[i];
}
memset ( dp , 0 , sizeof ( dp ) );
dp[0] = 1;
for ( int i = 1 ; i <= n ; i++ )
{
if ( c[i]*v[i] >= sum )
{
for ( int j = c[i] ; j <= sum ; j++ )
if ( dp[j-c[i]] ) dp[j] = 1;
continue;
}
int k = 1;
while ( k < v[i] )
{
for ( int j = sum ; j >= k*c[i] ; j-- )
if ( dp[j-k*c[i]] ) dp[j] = 1;
v[i] -= k;
k<<=1;
}
for ( int j = sum ; j >= v[i]*c[i] ; j-- )
if ( dp[j-v[i]*c[i]] ) dp[j] = 1;
}
for ( int i = (sum+1)/2 ; i <= sum ; i++ )
if ( dp[i] )
{
printf ( "%d %d\n" , i , sum - i );
break;
}
}
}
不要忘记赋初值,多么痛的领悟T_Thdu 1171 二进制优化的多重背包
最新推荐文章于 2024-10-01 18:52:56 发布