Cod sursa(job #1052827)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 11 decembrie 2013 20:37:09
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include<string.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,a[101],b[101],v[101][101],sol[101][101],i,tbun,x[2][101],soll[101][101];
int din(int t){
    memset(v,0,sizeof(v));
    memset(soll,0,sizeof(soll));
     for(int i=0;i*a[1]<=t;i++){

       v[1][i]=(t-i*a[1])/b[1];
       //soll[1][i]=i;
     }
      for(int i=2;i<=n;i++)
        for(int j=0;j<=l;j++)
            for(int k=0;k<=j;k++)
            if((j-k)*a[i]<=t)
               if(v[i][j]<v[i-1][k]+(t-(j-k)*a[i])/b[i]){
                  v[i][j]=v[i-1][k]+(t-(j-k)*a[i])/b[i];
                  soll[i][j]=k;
                }
         if(v[n][l]>=l)
          return 1;
       return 0;

}

void reconstit(int n,int k){
int t=n;int nr=0;
 while(t>1){
 nr++;
 x[nr][1]=k-soll[t][k];
 x[nr][2]=sol[t][k]-sol[t-1][soll[t][k]];
 k=soll[t][k];
 t--;
 }
 nr++;
 x[nr][1]=k;
 x[nr][2]=sol[1][k];
 for(int i=nr;i>=1;i--)
   g<<x[i][1]<<" "<<x[i][2]<<"\n";
}
int main()
{
    f>>n>>l;
    for(i=1;i<=n;i++){
        f>>a[i]>>b[i];
    }
int    p=0;
  int   u=10000;
    while(p<=u){
      int  mij=(p+u)/2;
       int k=din(mij);
        if(k){
            tbun=mij;
            memcpy(sol,v,sizeof(v));
            u=mij-1;
        }
        else
          p=mij+1;
        }
   g<<tbun<<'\n';
  reconstit(n,l);
    return 0;
}