Pagini recente » Cod sursa (job #3236125) | Cod sursa (job #1031110) | Cod sursa (job #350528) | Cod sursa (job #3217273) | Cod sursa (job #52605)
Cod sursa(job #52605)
#include <stdio.h>
#include <memory.h>
#define NMAX 110
int n, l;
int a[NMAX], b[NMAX];
int t;
int v[NMAX];//v[i] = cant maxima de lapte b bauta, pt i de a
int vaux[NMAX];
int last[NMAX];//last[i] = ultimul care a baut o cant x din a(si x-a de b), pentru a obtine v[i]
void read()
{
int i;
scanf("%d %d\n", &n, &l);
for(i = 0; i < n; ++i)
{
scanf("%d %d\n", &a[i], &b[i]);
}
}
void afisare(int i, int t, int nr)
{
if(nr == -1)
return ;
afisare(i - last[i], t, nr-1);
printf("%d %d\n", last[i], (t - last[i]*a[nr])/b[nr]);
}
int dinamic(int t)
{
int i, j, k;
memset(v, 0, sizeof(v));
memset(vaux, 0, sizeof(vaux));
memset(last, 0, sizeof(last));
for(i = 0; i <= t/a[0]; ++i)
{
v[i] = (t - i*a[0])/b[0];
last[i] = i;
}
for(i = 1; i < n; ++i)
{
memcpy(vaux, v, sizeof(v));
for(j = 0; j < NMAX; ++j)
{
if(v[j])
{
for(k = 0; k <= t / a[i]; ++k)//ramane (t - k*a[i]) / b[i] de lapte b pe care-l poti bea ..
if(v[j] + ((t - k*a[i])/b[i]) > vaux[j + k])
{
vaux[j + k] = v[j] + ((t - k*a[i])/b[i]);
last[j + k] = k;
}
}
}
memcpy(v, vaux, sizeof(vaux));
}
for(i = l; i < NMAX; ++i)
{
if(v[i] >= l)
{
printf("%d\n", t);
afisare(i, t, n-1);
//for(j = 0; j <= i; ++j)
// printf("%d %d %d\n", j, v[j], last[j]);
return 1;
}
}
return 0;
}
int main()
{
int i;
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
read();
for(i = 1; i < NMAX; ++i)
{
if(dinamic(i))
return 0;
}
fclose(stdin);
fclose(stdout);
return 0;
}