Pagini recente » Cod sursa (job #2336821) | Cod sursa (job #3267307) | Cod sursa (job #2923030) | Cod sursa (job #2532367) | Cod sursa (job #2432926)
#include <bits/stdc++.h>
#define maxim 103
#define inf 1<<30
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 litri de lapte A
int sol[maxim][maxim];
bool dinamica(int ans)
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <=l; j++)
dp[i][j] = -inf;
dp[0][0] = 0;
for (int i=1;i<=n;i++)
for (int j=0; j<=l ;j++)
for (int x=0; x<=j ;x++) // cati litri 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=100;
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);
}