HDU 1171 ?

题目大意: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; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值