Pagini recente » Cod sursa (job #1205558) | Cod sursa (job #2093199) | Cod sursa (job #204235) | Cod sursa (job #879827) | Cod sursa (job #1263342)
#include <stdio.h>
#define MAXIN 100
#define INF 2000000000
int a[MAXIN], b[MAXIN], d[MAXIN][MAXIN + 1], lbi[MAXIN][MAXIN], rez[MAXIN];
char bun(int t, int n, int l){
int i, j, k, c;
for(i = 0; i < n; i++){
for(j = 0; j <= l; j++){
d[i][j] = -INF;
}
}
for(i = 0; i < n; i++){
for(j = 0; j <= l; j++){
if(i == 0){
d[i][j] = (t - j * a[i]) / b[i];
lbi[i][j] = j;
}
else{
for(k = 0; k <= j && t >= (k * a[i]); k++){
c = d[i - 1][j - k] + (t - k * a[i]) / b[i];
if(d[i][j] < c){
d[i][j] = c;
lbi[i][j] = k;
}
}
}
}
}
return d[n - 1][l] >= l;
}
void refac(int n, int l){
while(n >= 0){
rez[n] = lbi[n][l];
l -= rez[n];
n--;
}
}
int main(){
FILE *in = fopen("lapte.in", "r");
int n, l, i;
fscanf(in, "%d%d", &n, &l);
for(i = 0; i < n; i++){
fscanf(in, "%d%d", &a[i], &b[i]);
}
fclose(in);
int pas;
i = 0;
for(pas = 1 << 14; pas > 0; pas >>= 1){
if(!bun(i + pas, n, l))
i += pas;
}
i++;
bun(i, n, l);
FILE *out = fopen("lapte.out", "w");
fprintf(out, "%d\n", i);
refac(n - 1, l);
int j;
for(j = 0; j < n; j++){
fprintf(out, "%d %d\n", rez[j], (i - rez[j] * a[j]) / b[j]);
}
fclose(out);
return 0;
}