Pagini recente » Cod sursa (job #2807488) | Cod sursa (job #1377042) | Cod sursa (job #2352346) | Cod sursa (job #2328966) | Cod sursa (job #1268357)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define MAX 102
int p[MAX][MAX];
int c[MAX][MAX], n, l, a[MAX], b[MAX];
pair<int, int> sta[MAX];
void af(int a[MAX][MAX])
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=l;j++)
{
cout << a[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
bool rez(int t)
{
int i, j, k;
memset(c, -1, sizeof(c));
memset(p, 0, sizeof(p));
for(i=0;i<=n;i++)
{
c[i][0]=0;
}
for(i=0;i<n;i++)
{
for(j=0;j<=l;j++)
{
for(k=0;k<=t && k+j<=l;k++)
{
if(c[i][j]!=-1)
if(c[i+1][j+k]<c[i][j]+(t-a[i+1]*k)/b[i+1])
{
c[i+1][j+k]=c[i][j]+(t-a[i+1]*k)/b[i+1];
p[i+1][j+k] = j;
}
}
}
}
if(c[n][l]>=l)
return 1;
return 0;
}
int main()
{
int i, st, dr, k;
fin>>n>>l;
for(i=1;i<=n;i++)
{
fin>>a[i]>>b[i];
}
st=1;
dr=100;
while(st<dr)
{
int t=(st+dr)>>1;
k=rez(t);
if(k)
dr=t;
else
st=t+1;
}
rez(st);
fout << st << "\n";
int r=l;
dr=0;
for(i=n;i>=1;i--)
{
sta[++dr]=make_pair(r-p[i][r], c[i][r]-c[i-1][p[i][r]]);
r=p[i][r];
}
for(i=dr;i>=1;i--)
{
fout << sta[i].first << " " << sta[i].second << "\n";
}
}