Pagini recente » Cod sursa (job #2148174) | Cod sursa (job #641158) | Cod sursa (job #286134) | Cod sursa (job #2115205) | Cod sursa (job #2394105)
#include <iostream>
#include <fstream>
using namespace std;
const int _oo = 0x80000001;
struct bautura
{
int a, b;
};
bautura v[105];
int N, L;
int d[105][105]; ///d[i][j] = cant max de b care poate fi bauta a.i. sa se poata bea exact j litri de a de primele i persoane
int r[105][105];
int sol;
int get_b (int maxt, int i, int j)
{
return (maxt - v[i].a * j)/v[i].b;
}
int bun (int t) ///incerc sa determin daca se poate bea cantitatea L in timpul T, pentru asta o sa prioritizez cu lapte A si o sa vad cat B imi ramane...
{
for(int i = 0; i <= N; ++i) ///trebe sa curat ca apelez asta de mai multe ori
for(int j = 0; j <= L; ++j)
d[i][j] = _oo;
d[0][0] = 0;
for(int i = 1; i <= N; ++i)
for(int j = 0; j <= min(L, t/v[i].a); ++j)
for(int k = j; k <= L; ++k)
if(d[i][k] < d[i - 1][k - j] + get_b(t, i, j))
{
d[i][k] = d[i - 1][k - j] + get_b(t, i, j);
///store cat bea fiecare
r[i][k] = j;
}
if(d[N][L] >= L)
return 1;
else
return 0;
}
ofstream out ("lapte.out");
void afis(int n, int cant)
{
if (n > 0)
{
afis( n - 1, cant - r[n][cant]);
out<<r[n][cant]<<" "<<get_b(sol, n, r[n][cant])<<"\n";
}
}
int main()
{
ifstream in ("lapte.in");
in>>N>>L;
for(int i = 1; i <= N; ++i)
in>>v[i].a>>v[i].b;
//T < 100
int b = 1, e = 104;
while(b < e)
{
int tmid = (b + e) / 2;
if(bun(tmid)) ///caut timpul minim
{
//cout<<"SE POATE BEA IN "<<tmid<<"\n";
e = tmid;
sol = tmid;
}
else
b = tmid + 1;
}
bun(sol);
afis(N, L);
return 0;
}