#include <bits/stdc++.h> 
using  namespace  std; 
 
void  printknapSack( int  W, int  wt[ ] , int  val[ ] , int  n) 
{ 
    int  i, w; 
    int  K[ n +  1 ] [ W +  1 ] ; 
 
    for  ( i =  0 ;  i <=  n;  i++ ) 
    { 
        for  ( w =  0 ;  w <=  W;  w++ ) 
        { 
            if  ( i ==  0  ||  w ==  0 ) 
            { 
                K[ i] [ w]  =  0 ; 
            } 
            else  if  ( wt[ i -  1 ]  <=  w) 
            { 
                K[ i] [ w]  =  max( val[ i -  1 ]  +  K[ i -  1 ] [ w -  wt[ i -  1 ] ] , K[ i -  1 ] [ w] ) ; 
            } 
             else 
            { 
                K[ i] [ w]  =  K[ i -  1 ] [ w] ; 
            } 
        } 
    } 
 
    int  res =  K[ n] [ W] ; 
    cout  << endl<<  "Max-Profit: "  <<  res <<  endl; 
    cout  << endl<<  "The Items are: " << endl<< endl; 
 
    w =  W; 
    for  ( i =  n;  i >  0  &&  res >  0 ;  i-- ) 
    { 
        if  ( res ==  K[ i -  1 ] [ w] ) 
            continue ; 
        else 
        { 
            cout  << "Item Number: "  << i <<  " and Weight: " << wt[ i -  1 ]  << endl; 
            res =  res -  val[ i -  1 ] ; 
            w =  w -  wt[ i -  1 ] ; 
        } 
    } 
} 
 
int  main( ) 
{ 
    int  nbag,wt,w; 
    cout << "Enter the number of bags: " ; 
    cin  >>  nbag; 
    int  values[ nbag] ; 
    cout << "Enter the values: " ; 
    for ( int  i= 0 ;  i< nbag;  i++ ) { 
        cin >>  values[ i] ; 
    } 
 
    int  weight[ nbag] ; 
    cout << "Enter the weights of bags: " ; 
    for ( int  i= 0 ;  i< nbag;  i++ ) { 
        cin >>  weight[ i] ; 
    }     
    cout << "Enter the maximum weight of the bag: " ; 
    cin >> w; 
 
    int  n =  sizeof ( values)  /  sizeof ( values[ 0 ] ) ; 
 
    printknapSack( w, weight, values, n) ; 
 
    return  0 ; 
} 
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIHByaW50a25hcFNhY2soaW50IFcsIGludCB3dFtdLCBpbnQgdmFsW10sIGludCBuKQp7CiAgICBpbnQgaSwgdzsKICAgIGludCBLW24gKyAxXVtXICsgMV07CgogICAgZm9yIChpID0gMDsgaSA8PSBuOyBpKyspCiAgICB7CiAgICAgICAgZm9yICh3ID0gMDsgdyA8PSBXOyB3KyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaSA9PSAwIHx8IHcgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS1tpXVt3XSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAod3RbaSAtIDFdIDw9IHcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtbaV1bd10gPSBtYXgodmFsW2kgLSAxXSArIEtbaSAtIDFdW3cgLSB3dFtpIC0gMV1dLCBLW2kgLSAxXVt3XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS1tpXVt3XSA9IEtbaSAtIDFdW3ddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGludCByZXMgPSBLW25dW1ddOwogICAgY291dCA8PGVuZGw8PCAiTWF4LVByb2ZpdDogIiA8PCByZXMgPDwgZW5kbDsKICAgIGNvdXQgPDxlbmRsPDwgIlRoZSBJdGVtcyBhcmU6ICI8PGVuZGw8PGVuZGw7CgogICAgdyA9IFc7CiAgICBmb3IgKGkgPSBuOyBpID4gMCAmJiByZXMgPiAwOyBpLS0pCiAgICB7CiAgICAgICAgaWYgKHJlcyA9PSBLW2kgLSAxXVt3XSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCJJdGVtIE51bWJlcjogIiA8PGkgPDwgIiBhbmQgV2VpZ2h0OiAiPDx3dFtpIC0gMV0gPDxlbmRsOwogICAgICAgICAgICByZXMgPSByZXMgLSB2YWxbaSAtIDFdOwogICAgICAgICAgICB3ID0gdyAtIHd0W2kgLSAxXTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgaW50IG5iYWcsd3QsdzsKICAgIGNvdXQ8PCJFbnRlciB0aGUgbnVtYmVyIG9mIGJhZ3M6ICI7CiAgICBjaW4gPj4gbmJhZzsKICAgIGludCB2YWx1ZXNbbmJhZ107CiAgICBjb3V0PDwiRW50ZXIgdGhlIHZhbHVlczogIjsKICAgIGZvcihpbnQgaT0wOyBpPG5iYWc7IGkrKyl7CiAgICAgICAgY2luPj4gdmFsdWVzW2ldOwogICAgfQoKICAgIGludCB3ZWlnaHRbbmJhZ107CiAgICBjb3V0PDwiRW50ZXIgdGhlIHdlaWdodHMgb2YgYmFnczogIjsKICAgIGZvcihpbnQgaT0wOyBpPG5iYWc7IGkrKyl7CiAgICAgICAgY2luPj4gd2VpZ2h0W2ldOwogICAgfSAgICAKICAgIGNvdXQ8PCJFbnRlciB0aGUgbWF4aW11bSB3ZWlnaHQgb2YgdGhlIGJhZzogIjsKICAgIGNpbj4+dzsKCiAgICBpbnQgbiA9IHNpemVvZih2YWx1ZXMpIC8gc2l6ZW9mKHZhbHVlc1swXSk7CgogICAgcHJpbnRrbmFwU2Fjayh3LCB3ZWlnaHQsIHZhbHVlcywgbik7CgogICAgcmV0dXJuIDA7Cn0=