Pagini recente » Cod sursa (job #286421) | Cod sursa (job #254631) | Cod sursa (job #332442) | Cod sursa (job #1272605) | Cod sursa (job #1819447)
#include <stdio.h>
#define INF 2000000000
using namespace std;
struct lapte
{
int a, b;
};
lapte v[101];
int n, l, a[101][101], b[101][101], rez;
bool ok(int t)
{
a[0][0]=0;
for(int i=1; i<=l; i++)
a[0][i]=-INF;
for(int i=1; i<=n; i++)
for(int j=1; j<=l; j++)
{
int max=-INF;
b[i][j]=0;
for(int k=0; k<=j; k++)
{
if(k*v[i].a>t)
continue;
if(max<a[i-1][j-k]+(t-k*v[i].a)/v[i].b)
{
max=a[i-1][j-k]+(t-k*v[i].a)/v[i].b;
b[i][j]=k;
}
}
a[i][j]=max;
}
if(a[n][l]>=l) return true;
return false;
}
int binsearch()
{
int i, step=1<<7;
for(i=0; step; step>>=1)
{
if(!ok(i+step))
i+=step;
}
return i+1;
}
void reconstructie(int i, int j)
{
if(i==0) return;
reconstructie(i-1, j-b[i][j]);
printf("%d %d\n", b[i][j], (rez-b[i][j]*v[i].a)/v[i].b);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d%d", &n, &l);
for(int i=1;i<=n;i++)
scanf("%d%d", &v[i].a, &v[i].b);
rez=binsearch();
printf("%d\n", rez);
ok(rez);
reconstructie(n, l);
return 0;
}