Pagini recente » Cod sursa (job #2672755) | Cod sursa (job #619990) | Cod sursa (job #261474) | Cod sursa (job #1414277) | Cod sursa (job #2460504)
#include <bits/stdc++.h>
#define MAX 131072
using namespace std;
const int NMAX = 103;
FILE *IN;
struct lapte{
int x, y;
}v[NMAX];
int N, L, ans;
int dp[NMAX][NMAX], poz[NMAX][NMAX];
int pos, sign;
char f[MAX];
inline void Read(int &nr){
sign = 0;
nr = 0;
while(f[pos] < '0' || f[pos] > '9'){
if(f[pos] == '-') sign = 1;
pos++;
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
while(f[pos] >= '0' && f[pos] <= '9'){
nr = 10 * nr + f[pos++] - '0';
if(pos == MAX)
fread(f, MAX, 1, IN), pos = 0;
}
if(sign) nr =- nr;
}
inline void read(){
Read(N); Read(L);
for(int i = 1; i <= N; i++){
Read(v[i].x); Read(v[i].y);
}
}
bool dinamica(int t){
for(int i = 0; i <= N; i++)
for(int j = 0; j <= L; j++)
dp[i][j] = -2e9;
dp[0][0] = 0;
for(int i = 1; i <= N; i++)
for(int j = 0; j <= t / v[i].x && j * v[i].x <= t; j++){
int x = (t - j * v[i].x) / v[i].y;
for(int k = 0; k + j <= L; k++)
if(dp[i][k + j] < dp[i - 1][k] + x){
dp[i][k + j] = dp[i - 1][k] + x;
poz[i][k + j] = j;
}
}
return dp[N][L] >= L;
}
void afisare(int i, int j){
int x = poz[i][j];
int y = (ans - x * v[i].x) / v[i].y;
if(i != 1)
afisare(i - 1, j - x);
printf("%d %d\n", x, y);
}
int main(){
IN = fopen("lapte.in", "r");
freopen("lapte.out", "w", stdout);
read();
int st = 1, nd = 100, mid;
while(st <= nd){
mid = (st + nd) / 2;
if(dinamica(mid)){
ans = mid;
nd = mid - 1;
} else st = mid + 1;
}
dinamica(ans);
printf("%d\n", ans);
afisare(N, L);
return 0;
}