Pagini recente » Cod sursa (job #2833344) | Cod sursa (job #2149142) | Cod sursa (job #2959891) | Cod sursa (job #1920344) | Cod sursa (job #3190952)
#include <fstream>
#define INF 0x3FFFFFFF
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int d[105][105];
int n,l;
struct om
{
int a;
int b;
} v[105];
int s[105][105];
bool good(int val)
{
for(int i=0; i<=n; i++)
for(int j = 0; j<=l; j++)
d[i][j] = -INF;
d[0][0]=0;
for(int i=1; i<=n; i++)
for(int astart = 0; astart<=l; astart++)
for(int x = 0; astart + x <=l; x++)
{
if(v[i].a * x > val)
break;
int badd = min((val - v[i].a * x)/v[i].b,l-d[i-1][astart]);
if(d[i-1][astart] + badd > d[i][astart + x])
d[i][astart + x] = d[i-1][astart] + badd;
}
return d[n][l]>=l;
}
bool gen(int val)
{
for(int i=0; i<=n; i++)
for(int j = 0; j<=l; j++)
d[i][j] = -INF;
d[0][0]=0;
for(int i=1; i<=n; i++)
for(int astart = 0; astart<=l; astart++)
for(int x = 0; astart + x <=l; x++)
{
if(v[i].a * x > val)
break;
int badd = min((val - v[i].a * x)/v[i].b,l-d[i-1][astart]);
if(d[i-1][astart] + badd > d[i][astart + x]){
d[i][astart + x] = d[i-1][astart] + badd;
s[i][astart +x] = astart;
}
}
return d[n][l]>=l;
}
int cb()
{
int st = 1;
int dr = 100;
int sl = 0;
while(st<=dr)
{
int mid = (st+dr)/2;
if(good(mid))
sl=mid,dr=mid-1;
else
st=mid+1;
}
return sl;
}
void rec(int i,int j)
{
if(i!=0 || j!=0)
{
rec(i-1,s[i][j]);
fout<<j-s[i][j]<<' '<<d[i][j]-d[i-1][s[i][j]]<<'\n';
}
}
int main()
{
fin>>n>>l;
for(int i=1; i<=n; i++)
fin>>v[i].a>>v[i].b;
int rez = cb();
fout<<rez<<'\n';
gen(rez);
rec(n,l);
}