Cod sursa(job #1336276)

Utilizator xtreme77Patrick Sava xtreme77 Data 7 februarie 2015 14:32:00
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
/*
 * Code by Spiromanul
 */

# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "deque"
# include "cstdlib"

const char IN [ ] = "ghiozdan.in" ;
const char OUT [ ] = "ghiozdan.out" ;
const int MAX = 76099 ;
const int MIN = 300 ;

# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )
# define read(a) cin>>a
# define write(a) cout<<a<<'\n'

using namespace std;

ifstream cin ( IN ) ;
ofstream cout ( OUT ) ;

int fv [ MIN ] , dp [ MAX ] ;
int BOSS [ MAX ] ;

int main ( void )
{
    int n , MAXX ;
    read ( n ) ; read ( MAXX ) ;
    FORN ( i , 1 , n )
    {
        int x ;
        read ( x ) ;
        fv [ x ] ++ ;
    }
    dp [ 0 ] = 1 ;
    FORNBACK ( i , 200 , 0 )
        if ( fv [ i ] )
        {
            for ( int j = MAX ; j >= 0  ; -- j )
                if ( dp [ j ] )
                {
                    for ( int k = 1 ; k <= fv [ i ] and j + k * i <= MAXX ; ++ k )
                    {
                        if ( dp [ j + k * i ] ) break ;

                        dp [ j + k * i ] = dp [ j ] + k ;
                        BOSS [ j + k * i ] = i ;
                    }
                }
        }
    FORNBACK ( i , MAXX , 0 )
        if ( dp [ i ] )
        {
            cout << i << ' ' << dp [ i ] - 1 << '\n' ;
            while ( i )
            {
                write( BOSS [ i ] ) ;
                i -= BOSS [ i ] ;
            }
            exit ( 0 ) ;
        }
    return 0;
}