队列式
struct NodeType
{
int no;
int i;
int w;
int v;
int x[ MAXN] ;
double ub;
} ;
void bound ( NodeType & e)
{
int i= e. i+ 1 ;
int sumw= w[ i] ;
double sumv= v[ i] ;
while ( ( sumw+ w[ i] <= W) && i<= n)
{
suw+ = w[ i] ;
sumv+ = v[ i] ;
i++ ;
}
if ( i<= n)
e. ub= sumv+ ( W- sumw) * v[ i] / w[ i] ;
else
e. ub= sumv;
}
void EnQueue ( NodeType & e, queue< NodeType> & qu)
{
if ( e. i== n)
{
if ( e. v< maxv)
{
maxv= e. v;
for ( int j= 1 ; < j<= n; j++ )
best[ j] = x[ j] ;
}
qu. push ( e) ;
}
}
void bfs ( )
{
NodeType e, e1, e2;
queue< NodeType> qu;
e. i= 0 ;
e. w= e. v= 0 ;
e. no= total++ ;
for ( int j= 1 ; j<= n; j++ )
e. x[ j] = 0 ;
bound ( e) ;
qu. push ( e) ;
while ( ! qu. empty ( ) )
{
e= qu. front ( ) ;
qu. pop ( ) ;
if ( e. w+ w[ e. i+ 1 ] <= W)
{
e1. no= total++ ;
e1. i= e. i+ 1 ;
e1. w= e. w+ w[ e. i] ;
e1. v= e. v+ v[ e. v] ;
for ( int j= 1 ; j<= n; j++ )
e1. x[ j] = e. x[ j] ;
e1. x[ e. i] = 1 ;
bound ( e1) ;
EnQueue ( e1, qu) ;
}
e2. no= total++ ;
e2. i= e. i+ 1 ;
e2. w= e. w;
e2. v= e. v;
for ( int j= 1 ; j<= n; j++ )
e2. x[ j] = e. x[ j] ;
e2. x[ e2. i] = 0 ;
bound ( e2) ;
if ( e2. ub> maxv)
EnQueue ( e2, qu) ;
}
}
优先队列式
struct NodeType
{
int no;
int i;
int w;
int v;
int x[ MAXN] ;
double ub;
operator < ( const NodeType & s) const
{
return ub< s. ub;
}
} ;
void bound ( NodeType & e)
{
int i= e. i+ 1 ;
int sumw;
double sumv;
while ( ( e. w+ w[ i] <= W) && i<= n)
{
sumw+ = e. w;
sumv+ = e. v;
i++ ;
}
if ( i<= n)
e. ub= sumv+ ( W- sumw) * v[ i] / w[ i] ;
else
e. ub= sumw;
}
void EnQueue ( NodeType e, priority_queue & qu)
{
if ( e. i== n)
{
if ( e. v> maxv)
{
maxv= e. v;
for ( int j= 1 ; j<= n; j++ )
best[ j] = x[ j] ;
}
else qu. push ( e) ;
}
}
void bfs ( )
{
NodeType e, e1, e2;
priority_queue < NodeType> qu;
e. i= e. w= e. v= 0 ;
e. no= total++ ;
for ( int j= 1 ; j<= n; j++ )
e. x[ j] = 0 ;
bound ( e) ;
qu. push ( e) ;
while ( ! qu. empty ( ) )
{
e= qu. top ( ) ;
qu. pop ( ) ;
if ( e. w+ w[ e. i+ 1 ] <= W)
{
e1. i= e. i+ 1 ;
e1. no= total++ ;
e1. v= e. v+ v[ i] ;
e1. w= e. w+ w[ i] ;
for ( int j= 1 ; j<= n; j++ )
e1. x[ j] = e. x[ j] ;
e1. x[ e1. i] = 1 ;
bound ( e1) ;
EnQueue ( e1, qu) ;
}
e2. i= e2. i+ 1 ;
e2. no= total++ ;
e2. v= e. v;
e2. w= e. w;
for ( int j= 1 ; j<= n; j++ )
e2. x[ j] = e. x[ j] ;
e2. x[ e2. i] = 0 ;
bound ( e2) ;
if ( e2. ub> maxv)
EnQueue ( e2, qu) ;
}
}