Pagini recente » Cod sursa (job #2802964) | Cod sursa (job #2010984) | Cod sursa (job #1612938) | Cod sursa (job #1535564) | Cod sursa (job #508559)
Cod sursa(job #508559)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;
const int INF = 1000000005;
const int NMAX = 105;
const int TMAX = 105;
const int LMAX = 105;
const int lg_TMAX = 7;
int N, L, T;
pair<int, int> cost[NMAX];
int d[NMAX][LMAX], vine[NMAX][LMAX];
void citi()
{
scanf("%d%d", &N, &L);
for(int i = 1 ; i <= N ; i++)
scanf("%d%d", &cost[i].first, &cost[i].second);
}
void init()
{
for(int i = 1 ; i <= NMAX ; i++)
for(int j = 0 ; j <= LMAX ; j++)
d[i][j] = -INF;
}
int dinamic(int t)
{
for(int k = 0 ; cost[1].first * k <= t && k <= L ; k++)
d[1][k] = (t - cost[1].first * k)/cost[1].second;
for(int i = 1 ; i < N ; i++)
for(int j = 0 ; j <= L ; j++)
for(int k = 0 ; cost[i + 1].first * k <= t && k + j <= L ; k++)
if(d[i][j] + (t - cost[i + 1].first * k)/cost[i + 1].second >= d[i + 1][j + k])
{
d[i + 1][j + k] = d[i][j] + (t - cost[i + 1].first * k)/cost[i + 1].second;
vine[i + 1][j + k] = j;
}
if(d[N][L] >= L)
return 1;
return 0;
}
void caut_bin()
{
int Q = 1<<lg_TMAX;
while(Q)
{
if(T + Q < TMAX && !dinamic(T + Q))
T += Q;
init();
Q >>= 1;
}
T++;
dinamic(T);
}
void scrie()
{
printf("%d\n", T);
pair<int, int> sol[NMAX];
int NR = 0;
for(int i = N , j = L; i ; i--)
{
sol[++NR].first = j - vine[i][j];
sol[NR].second = d[i][j] - d[i - 1][vine[i][j]];
j = vine[i][j];
}
for(int i = N ; i ; i--)
printf("%d %d\n", sol[i].first, sol[i].second);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
citi();
caut_bin();
scrie();
return 0;
}