Pagini recente » Cod sursa (job #3164825) | Cod sursa (job #1258919) | Cod sursa (job #214163) | Cod sursa (job #500545) | Cod sursa (job #2432916)
#include <bits/stdc++.h>
#define maxim 103
using namespace std;
/*
ifstream f("../dt.in");
ofstream g("../dt.out");
*/
ifstream f("lapte.in");
ofstream g("lapte.out");
pair <int , int > betivi[maxim];
int n,l;
int dp[maxim][maxim]; // max. de litri de lapte B bauti de primii i oameni , stiind ca s- au baut j litrii de lapte A
int sol[maxim][maxim];
bool dinamica(int ans)
{
memset(dp,-1, sizeof(dp));
for (int i=0 ;i<=l ;i++)
dp[1][i]=(ans-i*betivi[1].first)/betivi[1].second;
for (int i=2;i<=n;i++)
for (int j=0; j<=l ;j++)
for (int x=0; x<=j ;x++) // cati litrii au baut inaintea lui
{
int b=(j-x)*betivi[i].first;
if (b<=ans)
{
int plus=(ans-b)/betivi[i].second;
if (dp[i][j]< dp[i-1][x]+plus)
{
dp[i][j]=dp[i-1][x]+plus;
sol[i][j]=x;
}
}
}
return (dp[n][l]>=l);
}
int a=0, b=0;
void rep(int i,int x)
{
if (i==1)
{
g<<x<<" "<<dp[1][x]<<'\n';
a+=x;
b+=dp[1][x];
return;
}
rep(i-1,sol[i][x]);
g<<x-a<<" "<<dp[i][x]-b<<'\n';
a+=x-a;
b+=dp[i][x]-b;
}
int main()
{
f>>n>>l;
for (int i=1;i<=n;i++)
f>>betivi[i].first>>betivi[i].second;
//bs
int i=1,j=101;
while (i<=j)
{
int m=(i+j)/2;
if (dinamica(m))
j=m-1;
else i=m+1;
}
g<<i<<'\n';
dinamica(i);
rep (n,l);
}