Pagini recente » Cod sursa (job #141684) | Cod sursa (job #738409) | Cod sursa (job #3290405) | Cod sursa (job #1291139) | Cod sursa (job #1123186)
#include <iostream>
#include <fstream>
#include <cstring>
#define DN 105
#define INF (1<<30)
using namespace std;
int dp[DN][DN],prec[DN][DN],n,l,A[DN],B[DN],cnt[DN];
bool check(int T){
for(int i=0;i<=n;++i)
for(int j=0;j<=l;++j){
prec[i][j]=0;
dp[i][j]= -INF;
}
/// dp[i][j] = pentru primii i , nr max de litri bauti din B daca am baut j litri din A
dp[0][0]=0;
for(int i=1;i<=n;++i){
for(int j=0;j<=l;++j){
for(int k=0;k<=j;++k){ /// am baut k litri din A si mai bem j-k
if( T - (j-k)*A[i] >= 0)
if( dp[i][j] < dp[i-1][k] + (T - (j-k)*A[i])/B[i] ){
dp[i][j] = dp[i-1][k] + (T - (j-k)*A[i])/B[i];
prec[i][j] = k;
}
}
}
}
return dp[n][l] >= l;
}
int caut(){
int st = 0 , dr = 100 , rez = -1;
for(int mij=( (st+dr)>>1 ); st<=dr ; mij =( (st+dr)>>1 )){
if(check(mij)){
rez = mij;
dr = mij - 1;
}else
st = mij + 1;
}
return rez;
}
int main()
{
int rez;
ifstream f("lapte.in");
ofstream g("lapte.out");
f>>n>>l;
for(int i=1;i<=n;++i)
f>>A[i]>>B[i];
rez = caut();
check(rez);
for(int i=n,j=l,k ; i ;){
k = prec[i][j];
A[i] = j - k;
B[i] = dp[i][j] - dp[i-1][k];
j = k;
--i;
}
g<<rez<<"\n";
for(int i=1;i<=n;++i)
g<<A[i]<<" "<<B[i]<<"\n";
return 0;
}