Cod sursa(job #1527852)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 18 noiembrie 2015 19:50:46
Problema Matrix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int INF=1000000, NMAX=101;
int n, lit, sol, d[NMAX][NMAX], dd[NMAX][NMAX], a[NMAX], b[NMAX];
int ok(int val)
{
    int i, j, k, x, y;
    for(i=0; i<=n; i++)
    {
        for(j=0; j<=lit; j++)
            d[i][j]=-10000;
        d[i][0]=0;
    }
    for(i=1; i<=n; i++)
    {
        x=val/a[i];
        for(k=0; k<=x; k++)
        {
            y=(val-k*a[i])/b[i];
            for(j=lit; j>=k; j--)
                if(d[i][j]<d[i-1][j-k]+y)
                {
                    d[i][j]=d[i-1][j-k]+y;
                    dd[i][j]=k;
                }
        }
    }
    if(d[n][lit]>=lit)return 1;
    return 0;
}
void rec(int n, int lit)
{
    if(n==0)return ;
    rec(n-1, lit-dd[n][lit]);
    out<<dd[n][lit]<<' '<<(sol-a[n]*dd[n][lit])/b[n]<<'\n';
}
int main()
{

    int i, l, r, mid=0;
    in>>n>>lit;
    for(i=1; i<=n; i++)
        in>>a[i]>>b[i];
    l=1;
    r=100;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(ok(mid))
        {
            r=mid-1;
            sol=mid;
        }
        else
            l=mid+1;
    }
    out<<sol<<'\n';
    rec(n, lit);
    return 0;
}