Cod sursa(job #1358848)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 24 februarie 2015 20:13:15
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <fstream>
#define INF 2000000000
using namespace std;
int n, L, i, j, p, u, mid,nr, a[1100], b[1100], D[1100][1100],t[1100][110];
FILE *f, *g;

int verif(int T){
    int S = 0, X, Y;
    for(i = 0; i <= n; i ++)
    {
        for(j = 0; j <= L; j ++)
        {
        D[i][j] = -INF;
        }
    D[i][0] = 0;
    }

    for(i = 1; i <= n; i ++)
    {
        X = T / a[i];
        for(int k = 0; k <= X; k ++)
        {
            Y = (T - k * a[i])/ b[i];
            for(int j = L;j >= k; j --){
                if(D[i][j]<D[i-1][j-k]+Y){
                    D[i][j] =D[i - 1][j - k] + Y;
                    t[i][j]=k;
                }
            }
        }
    }
    if(D[n][L] >= L)
        return 1;

    return 0;
}
void path(int n,int L){
    if(n==0)
        return;
    path(n-1,L-t[n][L]);
    fprintf(g,"%d %d\n",t[n][L],(nr - a[n] * t[n][L])/ b[n]);
}
int main(){
    f = fopen("lapte.in","r");
    g = fopen("lapte.out","w");
    fscanf(f,"%d%d",&n,&L);
    for(i = 1;i <= n;i ++){
        fscanf(f,"%d%d", &a[i], &b[i]);
    }
    p = 1;
    u = 1000;
    while(p <= u){
        mid = (p + u) / 2;
        if( !verif(mid) )
            p = mid + 1;
        else{
            nr=mid;
            u = mid - 1;
        }

    }

    fprintf(g,"%d\n",nr);
    verif(nr);
    path(n,L);
    fclose(f);
    fclose(g);
    return 0;
}