Cod sursa(job #944289)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 aprilie 2013 23:51:03
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb

#include<cstring>
#include<cstdio>

#define NMAX 105
#define INF 0x3f3f3f3f

FILE *f=fopen("lapte.in","r");
FILE *g=fopen("lapte.out","w");

using namespace std;

struct milk
{
    int f_type;
    int s_type;

};
milk v[NMAX];
int quantity,Answer,n,DP[NMAX][NMAX];
int SOL[NMAX][NMAX];

void Read ( void )
{
    fscanf(f,"%d%d",&n,&quantity);

    for(int i(1) ; i <= n ; ++i  )
    {
        fscanf(f,"%d%d",&v[i].f_type,&v[i].s_type);
    }
   fclose(f);

}
void Initialize( void )
{
   memset(DP,-INF,sizeof(DP));
    DP[0][0]=0;

}
//DP[i][i]=cantitatea maxima de lapte B ce poate fi bautata pentru i lapte de A

bool check ( int TIME )
{
    Initialize();
    for(int i(1) ; i <= n ; ++i )
        for(int ii(0) ; ii <= quantity ; ++ii )
           for(int k(0) ; k*v[i].f_type <= TIME && k <= ii ; ++k )
                if( DP[i-1][ii-k] != -INF && DP[i][ii] < DP[i-1][ii-k]+ ( TIME - k*v[i].f_type )/v[i].s_type)
    {
        DP[i][ii]=DP[i-1][ii-k]+ ( TIME - k*v[i].f_type )/v[i].s_type;
        SOL[i][ii]=k;
    }

    return (DP[n][quantity]>=quantity);
}
void Solve ( void )
{
    int left=1,right=100;
    int mid;
    for(int i(1) ; i <= 100 ; ++i )
    {
        if(check(i))
        {
            Answer=i;
            break;
        }
    }
}

void Write ( int i , int l )
{
    if ( i == 0)
        return;
    Write(i-1,l-SOL[i][l]);
   fprintf(g,"%d %d\n",SOL[i][l],(Answer-SOL[i][l]*v[i].f_type)/v[i].s_type);
}


int main ( void )
{
    Read();
    Solve();
    fprintf(g,"%d\n",Answer);
    Write(n,quantity);
    fclose(g);
     return 0;
}