Pagini recente » Cod sursa (job #710301) | Cod sursa (job #2863254) | Cod sursa (job #266573) | Cod sursa (job #388887) | Cod sursa (job #1264309)
#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
struct lapte{
int a, b;
};
const int nmax = 106;
lapte v[nmax];
int n, d[nmax][nmax], mrasp[nmax][nmax], l, rasp, vrasp[nmax];
bool verificare(int x)
{
for(int i = 0; i<=n; i++)
for(int j = 0; j<=l; j++)
d[i][j] = -100000000;
d[0][0] = 0;
for(int i = 1; i<=n; i++)
{
for(int j = 0; j<=l; j++)
{
for( int k = 0; k<=j && k * v[i].a<=x; k++)
{
int aux = (x - k * v[i].a) / v[i].b;
if(d[i][j]<d[i - 1][j - k] + aux)
{
d[i][j] = d[i - 1][j - k] + aux;
mrasp[i][j] = k;
}
}
}
}
if(d[n][l]>=l)
return 1;
else
return 0;
}
int bs()
{
int hi = 106, lo = -1, mid;
while(hi - lo>1)
{
mid = (hi + lo) / 2;
if(verificare(mid)==1 && verificare(mid - 1)==0)
return mid;
if(verificare(mid)==1)
hi = mid;
else
lo = mid;
}
if(verificare(mid)==1 && verificare(mid - 1)==0)
return mid;
if(verificare(hi)==1 && verificare(hi - 1)==0)
return hi;
if(verificare(lo)==1 && verificare(lo - 1)==0)
return lo;
}
int main(){
int player_unu=0;
in>>n>>l;
for(int i = 1; i<=n; i++)
{
in>>v[i].a>>v[i].b;
}
rasp = bs();
verificare(rasp);
out<<rasp<<'\n';
int aux = n;
while(aux!=0)
{
vrasp[aux] = mrasp[aux][l];
l -= mrasp[aux][l];
aux--;
}
for(int i = 1; i<=n; i++)
{
out<<vrasp[i]<<' '<<(rasp - vrasp[i] * v[i].a) / v[i].b<<'\n';
}
return player_unu;
}