Pagini recente » Cod sursa (job #1503367) | Cod sursa (job #2561151) | Cod sursa (job #1446533) | Cod sursa (job #483438) | Cod sursa (job #1292722)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#define Nmax 100 + 10
#define F first
#define S second
using namespace std;
int N , L , i , j , SOL;
int D[Nmax][Nmax] , opt[Nmax][Nmax];
pair < int , int > a[Nmax] , v[Nmax];
bool CAN (int T)
{
memset(opt, 0, sizeof(opt));
memset(D, 0, sizeof(D));
for (i=0; i <= N; ++i)
for (j=1; j <= L; ++j)
D[i][j] = INT_MIN;
for (i=1; i <= N; ++i)
for (j=0; j <= L; ++j)
for (int l = 0; l <= min(T / a[i].F, j); ++l)
{
if (D[i-1][j-l] == INT_MIN) continue;
if (D[i][j] >= D[i-1][j-l] + (T - l * a[i].F)/a[i].S) continue;
D[i][j] = D[i-1][j-l] + (T - l * a[i].F)/a[i].S;
opt[i][j] = l;
}
if (D[N][L]>=L) return true;
return false;
}
void cb ()
{
int st = 0; int dr = L*(a[1].F+a[1].S);
for (int mij = (st+dr)>>1; st <= dr; mij = (st+dr)>>1)
{
if (CAN(mij)) SOL = mij, dr = mij-1;
else st = mij+1;
}
for (int i = N; i >= 1; --i)
{
v[i].F = opt[i][L];
L -= v[i].F;
v[i].S = (SOL - v[i].F*a[i].F) / a[i].S;
}
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d", &N, &L);
for (i=1; i <= N; ++i)
scanf("%d %d", &a[i].F, &a[i].S);
cb();
printf("%d\n", SOL);
for (i = 1; i <= N; ++i)
printf("%d %d\n", v[i].F, v[i].S);
return 0;
}