Pagini recente » Cod sursa (job #1947170) | Cod sursa (job #372918) | Cod sursa (job #2200670) | Cod sursa (job #760528) | Cod sursa (job #2484092)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n,st,dr,m,ans,l;
struct lapte
{
int a,b;
}v[110];
int d[110][110], TT[110][110];
bool verif(int t)
{
memset(d, -0x3f, sizeof(d));
memchr(TT,0,sizeof(TT));
///nr maxim de litri de A daca beau j litri de B cu i oameni
int s=0;
for(int i=1;i<=n;i++) s+=t/v[i].b;
if(s<l) return 0;
for(int i=0;i<=t/v[1].b && i <= l ; i++) {
d[1][i]=(t-i*v[1].b)/v[1].a;
TT[1][i] = 0;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<=l;j++)
for(int p=j;p>=0&&t-(j-p)*v[i].b>=0;p--)
if(d[i-1][p]+(t-(j-p)*v[i].b) / v[i].a>d[i][j])
{
d[i][j]=d[i-1][p]+(t-(j-p)*v[i].b) / v[i].a;
TT[i][j]=p;
}
}
if(d[n][l]>=l) return 1;
return 0;
}
void afisare(int p1,int cat)
{
if(p1==1) {
out<<d[1][cat]<<" "<<cat<<'\n';
return;
}
afisare(p1-1,TT[p1][cat]);
out<<d[p1][cat]-d[p1-1][TT[p1][cat]]<<" "<<cat-TT[p1][cat]<<'\n';
}
int main()
{
in>>n>>l;
for(int i=1;i<=n;i++)
in>>v[i].a>>v[i].b;
st=0;
dr=100;
while(st<=dr)
{
m=(st+dr)/2;
if(verif(m)) dr=m-1;
else st=m+1;
}
out<<st<<'\n';
verif(st);
afisare(n,l);
return 0;
}