Cod sursa(job #1907736)

Utilizator rangalIstrate Sebastian rangal Data 6 martie 2017 20:41:17
Problema Problema rucsacului Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#define in "rucsac.in"
#define out "rucsac.out"
#define min(a,b) (a < b ? a:b)
#define max(a,b) (a > b ? a:b)
#define SMAX 10003 * 5000

using namespace std;

ifstream fin(in);
ofstream fout(out);

int Smax = 0;
int n,Gmax,Cmax;
int G,V;
short G2[SMAX]; // G2[i] = Capacitatea minima pentru care obtinem suma i

void afisare()
{
    for(int i=0; i<=Smax; ++i)
        fout<<G2[i]<<" ";
    fout<<"\n";
}

int main()
{
    fin>>n>>Gmax;

    while(n--)
    {
        fin>>G>>V;

        for(int i=Smax; i>0; --i)
            if(G2[i])
            {
                if(G2[i+V] == 0 && G2[i] + G <=Gmax) G2[i+V] = G2[i] + G;
                    else G2[i+V] = min(G2[i+V], G2[i]+G);
                if(G2[i+V] >0)
                {
                    Smax = max(Smax,i+V);
                    Cmax = max(Cmax,i+V);
                }
            }
        if(G2[V] == 0) G2[V] = G;
            else G2[V] = min(G2[V],G);
        Smax = max(Smax,V);
        Cmax = max(Cmax,V);
    }

    //afisare();
    fout<<Cmax<<"\n";


    fin.close(); fout.close();
    return 0;
}