Cod sursa(job #3176760)

Utilizator pomeneacristianandreiPomenea Cristian-Andrei pomeneacristianandrei Data 27 noiembrie 2023 18:44:31
Problema Ghiozdan Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>

using namespace std;



ifstream f( "ghiozdan.in" );
ofstream g( "ghiozdan.out" );

const int dim_capacit = 75005, dim_obiecte = 20002;

int n, greut[ dim_obiecte ], frecv[ 202 ], R;
int dp[ dim_capacit ];
int tata[ dim_capacit ];


int main()
{
    int i, j, tinta, capacit;

    f >> n >> R;
    for( i = 1; i <= n; ++i )
        f >> greut[ i ],
        ++frecv[ greut[i] ];

    dp[ 0 ] = 1;
    for( i = 200; i > 0; --i )
        if(frecv[ i ]  !=  0 )
            for( capacit = R; capacit >= 0; --capacit )
                if( dp[ capacit ]  !=  0 )
                    {

                        tinta = min( frecv[ i ], (R - capacit) / i );
                        for (j = 1; j <= tinta; ++j)
                            {
                                if ( dp[j * i + capacit]  !=  0 )
                                    break;


                                dp[ j * i + capacit ] = dp[ capacit ] + j;
                                tata[ j * i + capacit ] = i;
                            }
                    }



    for( i = 1; i <= R; ++i )
        if( dp[ i ]  >  1 )
            g << "Numarul minim de obiecte pentru greutatea  " << i << "  este: " << dp[ i ] - 1 << endl;
        else
            g << "Greutatea " << i << " NU poate fi formata cu niciun obiect." << endl;

    i = R;
    while( dp[ i ]  == 0 )
        --i;

    g << i << " "  << dp[ i ] - 1 << endl;
    cout << "Din " << R << " pot umple " << i << " unitati, cu " << dp[ i ] - 1 << " obiecte. Apasa Enter." << endl;

    while( --dp[ i ] )
        {
            g << tata[ i ] << endl;
            i = i - tata[ i ];
        }

    return 0;
}