Pagini recente » Cod sursa (job #1509602) | Cod sursa (job #1767510) | Cod sursa (job #228459) | Cod sursa (job #1978103) | Cod sursa (job #1492467)
#include <cstdio>
#define NMAX 107
#define inf -2000000007
using namespace std;
int n, l, A[NMAX], B[NMAX], ans, d[NMAX][NMAX], dp[NMAX][NMAX];
int verific(int val)
{
int minim, valB;
for(int i = 0; i<= n; ++i)
{
for(int j = 0; j<= l; ++j)
{
d[i][j] = inf;
dp[i][j] = 0;
}
}
d[0][0] = 0;
for(int i = 0; i< n; ++i)
{
for(int j = 0; j<= l; ++j)
{
if(d[i][j] == inf) continue;
for(int valA = 0; valA<= l-j; ++valA)
{
minim = A[i+1]*valA;
if(minim > val) break;
valB = (val - minim)/B[i+1];
if(d[i+1][j+valA] >= d[i][j] + valB) continue;
d[i+1][j+valA] = d[i][j] + valB;
dp[i+1][j+valA] = j;
}
}
}
if(d[n][l] >= l) return 1;
return 0;
}
int cautbin()
{
int start = 0, fin = 100, step = 1<<10, index;
for(;step;step>>=1)
{
index = start + step;
if(index <= fin)
{
if(!verific(index))
{
start = index;
}
}
}
return start;
}
void afisare(int x, int y)
{
if(!x) return;
int valA, valB;
valA = y - dp[x][y];
valB = (ans - valA*A[x])/B[x];
afisare(x-1, y - valA);
printf("%d %d\n", valA, valB);
}
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]);
ans = cautbin()+1;
printf("%d\n", ans);
verific(ans);
afisare(n, l);
return 0;
}