Pagini recente » Cod sursa (job #878372) | Cod sursa (job #1090604) | Cod sursa (job #417870) | exemplu12 | Cod sursa (job #557974)
Cod sursa(job #557974)
#include <iostream>
#include <string>
using namespace std;
#define NM 105
#define inf 1000000
int N, A[NM], B[NM], L, DP[NM][NM], C[NM][NM], ANS[NM][2];
int posibil (int timp)
{
for (int l = 1; l <= L; ++l) DP[0][l] = -inf;
for (int i = 1; i <= N; ++i)
for (int l = 0; l <= L; ++l)
{
DP[i][l] = -inf;
C[i][l] = 0;
for (int c = 0; c <= l; ++c)
{
if (c * A[i] > timp) break;
if (DP[i][l] < DP[i-1][l-c] + (timp - c * A[i])/B[i])
{
DP[i][l] = DP[i-1][l-c] + (timp - c * A[i])/B[i];
C[i][l] = c;
}
}
}
if (DP[N][L] >= L) return 1;
return 0;
}
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", &A[i], &B[i]);
int st = 1, dr = 10000;
while (st < dr)
{
int mij = (st + dr)/2;
if (posibil(mij)) dr = mij;
else st = mij + 1;
//printf ("%d %d\n", mij, posibil(mij));
}
int timp = st;
printf ("%d\n", timp);
int LL = L;
for (int i = N; i >= 1; --i)
{
ANS[i][0] = C[i][LL], ANS[i][1] = (timp - C[i][LL] * A[i])/B[i];
LL -= C[i][LL];
}
for (int i = 1; i <= N; ++i) printf ("%d %d\n", ANS[i][0], ANS[i][1]);
return 0;
}