void bag ( int i, int cw, int w, int n, int * item, int * max) {
if ( cw== w || i== n) {
if ( cw > * max) {
* max = cw;
}
return ;
}
bag ( i+ 1 , cw, w, n, item, max) ;
if ( cw + item[ i] <= w)
bag ( i+ 1 , cw+ item[ i] , w, n, item, max) ;
}
void bag ( int i, int cw, int w, int n, int * item, int * max, int mem[ ] [ 10 ] ) {
if ( cw== w || i== n) {
if ( cw > * max) {
* max = cw;
}
return ;
}
if ( mem[ i] [ cw] == 1 )
return ;
mem[ i] [ cw] == 1 ;
bag ( i+ 1 , cw, w, n, item, max, mem) ;
if ( cw + item[ i] <= w)
bag ( i+ 1 , cw+ item[ i] , w, n, item, max, mem) ;
}
int bag ( int w, int n, int * item, bool state[ ] [ 11 ] ) {
state[ 0 ] [ 0 ] = true;
state[ 0 ] [ item[ 0 ] ] = true;
for ( int i= 1 ; i<= n- 1 ; i++ ) {
for ( int j= 0 ; j<= w+ 1 ; j++ ) {
if ( state[ i- 1 ] [ j] == true)
state[ i] [ j] = true;
}
for ( int j= 0 ; j<= w- item[ i] ; j++ ) {
if ( state[ i- 1 ] [ j] == true)
state[ i] [ j+ item[ i] ] = true;
}
}
for ( int i= w; i>= 0 ; i-- ) {
if ( state[ n- 1 ] [ i] == true)
return i;
}
}
int bag ( int w, int n, int * item, bool state[ 11 ] ) {
state[ 0 ] = true;
state[ item[ 0 ] ] = true;
for ( int i= 1 ; i<= n- 1 ; i++ ) {
for ( int j= 0 ; j<= w+ 1 ; j++ ) {
if ( state[ j] == true)
state[ j] = true;
}
for ( int j= 0 ; j<= w- item[ i] ; j++ ) {
if ( state[ j] == true)
stat[ j+ item[ i] ] = true;
}
}
for ( int i= w; i>= 0 ; i-- ) {
if ( state[ i] == true)
return i;
}
}
0-1背包升级问题,加上物品含有不同的价值,求可装入的最大价值
int bag ( int w, int n, int * item, int * value, int state[ ] [ 11 ] ) {
state[ 0 ] [ 0 ] = 0 ;
state[ 0 ] [ item[ 0 ] ] = 0 ;
for ( int i= 1 ; i<= n- 1 ; i++ ) {
for ( int j= 0 ; j<= w+ 1 ; j++ ) {
if ( state[ i- 1 ] [ j] >= 0 )
state[ i] [ j] = state[ i- 1 ] [ j] ;
}
for ( int j= 0 ; j<= w- item[ i] ; j++ ) {
if ( state[ i- 1 ] [ j] >= 0 ) {
int v = state[ i- 1 ] [ j] + value[ i] ;
if ( v > state[ i- 1 ] [ j+ item[ i] ] ) {
state[ i] [ j+ item[ i] ] = v;
}
}
}
}
int max = - 1 ;
for ( int i= w; i>= 0 ; i-- ) {
if ( state[ n- 1 ] [ i] > max)
max = state[ n- 1 ] [ j] ;
}
return max;
}