Pagini recente » Cod sursa (job #1548685) | Cod sursa (job #2705345) | Cod sursa (job #1646836) | Cod sursa (job #1307453) | Cod sursa (job #3309157)
#include <bits/stdc++.h>
#define NMAX 101
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int timp_a[NMAX], timp_b[NMAX];
int dp[2][NMAX]; ///fie j = numarul de litri de lapte A baut in timpul T, atunci dp[i%2][j] = numarul maxim de litri de lapte B care pot fi bauti in timpul T
pair<int, int> ult_poz[NMAX][NMAX], ult_val[NMAX][NMAX];
int litri_a[NMAX], litri_b[NMAX]; ///cati litri a baut fiecare persoana
bool posibil(int t, int n, int l) ///verifica daca se pot bea l litri din fiecare lapte in timpul t
{
for(int j=0; j<=l; j++) dp[0][j]=0, dp[1][j]=0;
for(int i=1; i<=n; i++)
{
for(int l_a=0; l_a*timp_a[i]<=t; l_a++) ///l_a = litri bauti din laptele A
{
int l_b = (t - l_a*timp_a[i]) / timp_b[i]; ///l_b = litri bauti din laptele B
//out << i << " " << l_a << " " << l_b << "\n";
for(int j=l; j>=l_a; j--)
{
dp[i%2][j]=dp[(i-1)%2][j];
if(dp[(i-1)%2][j-l_a]+l_b > dp[i%2][j])
{
dp[i%2][j] = dp[(i-1)%2][j-l_a] + l_b;
ult_poz[i][j]={i-1, j-l_a};
ult_val[i][j]={j, l_b};
}
}
}
}
//out << t << " \t"; for(int j=1; j<=l; j++) out << dp[n%2][j] << "\t\t"; out << "\n\n";
if(dp[n%2][l]>=l)
{
/*for(int i=1; i<=n; i++)
{
for(int j=0; j<=l; j++) out << ult_poz[i][j].first << " " << ult_poz[i][j].second << " \t"; out << "\n";
} out << "\n";*/
pair<int, int> poz={n, l};
for(int i=n; i>=1; i--)
{
//out << poz.first << " " << poz.second << "\n";
litri_a[i]=ult_val[poz.first][poz.second].first;
litri_b[i]=ult_val[poz.first][poz.second].second;
poz=ult_poz[poz.first][poz.second];
}
return 1;
}
else
{
return 0;
}
}
int cautare_binara(int n, int l) ///il cautam binar pe t
{
int st=0, dr=NMAX, t=dr;
while(st<=dr)
{
int mij=st+(dr-st)/2;
if(posibil(mij, n, l))
{
t=mij;
dr=mij-1;
}
else
{
st=mij+1;
}
}
return t;
}
int main()
{
int n, l;
in >> n >> l;
for(int i=1; i<=n; i++)
{
in >> timp_a[i] >> timp_b[i];
}
out << cautare_binara(n, l) << "\n";
//posibil(18, n, l);
for(int i=1; i<=n; i++) ///afisam solutia
{
out << litri_a[i] << " " << litri_b[i] << "\n";
}
return 0;
}