Pagini recente » Cod sursa (job #259519) | Cod sursa (job #1420091) | Cod sursa (job #590014) | Cod sursa (job #1134866) | Cod sursa (job #3190949)
#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];
pair<int,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] = {i-1,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(s[i][j].first,s[i][j].second);
fout<<j-s[i][j].second<<' '<<d[i][j]-d[s[i][j].first][s[i][j].second]<<'\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';
s[0][0]={-1,-1};
gen(rez);
rec(n,l);
}