Cod sursa(job #1819447)

Utilizator Matei_IgnutaMatei Ignuta Matei_Ignuta Data 30 noiembrie 2016 16:52:09
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#define INF 2000000000
using namespace std;
struct lapte
{
    int a, b;
};
lapte v[101];
int n, l, a[101][101], b[101][101], rez;
bool ok(int t)
{
    a[0][0]=0;
    for(int i=1; i<=l; i++)
        a[0][i]=-INF;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=l; j++)
        {
            int max=-INF;
            b[i][j]=0;
            for(int k=0; k<=j; k++)
            {
                if(k*v[i].a>t)
                    continue;
                if(max<a[i-1][j-k]+(t-k*v[i].a)/v[i].b)
                   {
                    max=a[i-1][j-k]+(t-k*v[i].a)/v[i].b;
                    b[i][j]=k;
                   }
            }
            a[i][j]=max;
        }
    if(a[n][l]>=l) return true;
    return false;
}
int binsearch()
{
    int i, step=1<<7;
    for(i=0; step; step>>=1)
    {
        if(!ok(i+step))
            i+=step;
    }
    return i+1;
}
void reconstructie(int i, int j)
{
    if(i==0) return;
    reconstructie(i-1, j-b[i][j]);
    printf("%d %d\n", b[i][j], (rez-b[i][j]*v[i].a)/v[i].b);
}
int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    scanf("%d%d", &n, &l);
    for(int i=1;i<=n;i++)
        scanf("%d%d", &v[i].a, &v[i].b);
    rez=binsearch();
    printf("%d\n", rez);
    ok(rez);
    reconstructie(n, l);
    return 0;
}