Pagini recente » Cod sursa (job #1116749) | Rating Tudoroiu Simona (simonatudoroiu) | Cod sursa (job #2027545) | Cod sursa (job #1200533) | Cod sursa (job #3190889)
#include <fstream>
#include <cstring>
#define INF 0x3FFFFFFF
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l;
struct om
{
int a;
int b;
} v[105];
/// a b
int d[155][155];
pair<int,int> t[105][105];
void gen(int val)
{
for(int i = 0;i<=l;i++)
for(int j=0;j<=l;j++)
d[i][j]=0,t[i][j]={0,0};
d[0][0]=1;
for(int i = 1;i<=n;i++)
for(int a = l;a>=0;a--)
for(int b = l;b>=0;b--)
if(d[a][b])
{
for(int x = 1; a+x<=l && x*v[i].a<=val; x++)
{
int ramas = min((val - x * v[i].a) / v[i].b,l-b);
d[a + x][b + ramas] = 1;
t[a+x][b+ramas]={a,b};
}
}
}
bool ok(int val)
{
for(int i = 1;i<=n+1;i++)
for(int j=0;j<=l;j++)
d[i][j]=-INF;
d[1][0]=0;
for(int i = 1;i<=n;i++)
for(int a = 0;a<=l;a++)
for(int x =0;x<=val/v[i].a;x++)
{
int br = min((val- x* v[i].a)/v[i].b,l-d[i][a]);
d[i+1][a+x] = max(d[i+1][a+x],d[i][a] + br);
}
return d[n+1][l]>=l;
}
int b_s()
{
int st = 1;
int dr = 100;
int p = -1;
while(st<=dr)
{
int mid = (st+dr)/2;
if(ok(mid))
dr=mid-1,p=mid;
else
st=mid+1;
}
}
void rec(int x,int y)
{
if(x!=0 || y!=0)
{
int tx = t[x][y].first;
int ty = t[x][y].second;
rec(tx,ty);
fout<<x-tx<<' '<<y-ty<<'\n';
}
}
int main()
{
fin>>n>>l;
for(int i=1; i<=n; i++)
fin>>v[i].a>>v[i].b;
int rez = b_s();
fout<<rez<<'\n';
gen(rez);
rec(l,l);
}