hdoj1171

// 用母函数来做

#include
< iostream >
#include
< stdio.h >
#include
< string .h >
using   namespace  std;
int  N, M, V, B, Max;
bool  s1[ 250000 ];         // 由于只要求知道存在与否,不要求数值,可以用bool型
int  main()
{
    
while  (scanf( " %d " & N)  !=  EOF  &&  N  >   - 1 ) {
    memset(s1, 
0 sizeof (s1));     // 初始化
    s1[ 0 =   1 ;
    Max 
=   0 ;
    
for  ( int  i  =   0 ; i  <  N;  ++ i) {
        scanf(
" %d%d " & V,  & M);
        
for  ( int  j  =   0 ; j  <=  M;  ++ j) {
        
for  ( int  k  =   0 ; k  <=  Max  /   2 ++ k) {
            s1[k 
+  j  *  V]  |=  s1[k];     // 与或,相当于'加'
        }
        }
        Max 
+=  V  *  M;     // 不断地增加最大数值
    }
    B 
=  Max  /   2 ;
    
while  ( ! s1[B])         // 只要能形成B,就一定能形成A(A=Max-B)
        B -- ;
    printf(
" %d %d\n " , Max  -  B, B);

    }
}


你可能感兴趣的:(OJ)