Cod sursa(job #645541)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 9 decembrie 2011 21:22:17
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
// dp[i][j] = cant de lapte de tip A pe care o beau primii i copii daca beau j litri de lapte B
// dp[i][j] = max(dp[i-1][j-k] + (T-k*B[i])/A[i]) , k * B[i] <= T
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

int n,l;
int dp[105][105],sol[105][105],aa[105][105];
struct {int i,j;} a[105];

inline bool check(int T)
{
    for(int i=0;i<=n;++i)
        for(int j=0;j<=l;++j)
            dp[i][j]=-1000000000;
    dp[0][0]=0;
    for(int i=1;i<=n;++i)
        for(int j=0;j<=l;++j)
            for(int k=0;k*a[i].j<=T && k<=j;++k)
            {
                int lg=dp[i-1][j-k]+(T-k*a[i].i)/a[i].j;
                if(dp[i][j]<lg)
                {
                    dp[i][j]=lg;
                    aa[i][j]=k;
                }
            }
    if(dp[n][l]>=l) return true;
    return false;
}

inline int bs()
{
    int i,cnt=128;
    for(i=100;cnt>0;cnt>>=1)
        if(check(i-cnt))
        {
            i-=cnt;
            memcpy(sol,aa,sizeof(aa));
        }
    return i;
}

ifstream f("lapte.in");
ofstream g("lapte.out");

int sl=0;

void afisare(int i,int j)
{
    if(i==0) return;
    afisare(i-1,j-sol[i][j]);
    g<<sol[i][j]<<' '<<(sl-a[i].i*sol[i][j])/a[i].j<<'\n';
}

int main()
{
    f>>n>>l;
    for(int i=1;i<=n;++i)
        f>>a[i].i>>a[i].j;

    g<<(sl=bs())<<'\n';
    afisare(n,l);
    g.close();
    return 0;
}