Pagini recente » Cod sursa (job #81700) | Cod sursa (job #1385332) | Cod sursa (job #1383100) | Cod sursa (job #430959) | Cod sursa (job #1234755)
#include <fstream>
#define nmax 105
using namespace std;
ifstream f("lapte.in"); ofstream g("lapte.out");
int n,L,dp[nmax][nmax],a[nmax],b[nmax],drum[nmax][nmax];
struct {int x,y;} rez[nmax];
bool verif(int T)
{ int i,j,k;
for(i=0;i<=n;i++) for(j=1;j<=L;j++) dp[i][j]=-1, drum[i][j]=0;
for(i=0;i<=n;i++) dp[i][0]=0, drum[i][0]=0;
// dp[i][j] = k;
// k = nr de litri bauti de tipul B in timpul T, avand j litri de tipul A si folosind primii i concurenti
for(i=1;i<=n;i++) //i-au fiecare concurent
{ for(j=0;j<=L;j++) //pentru fiecare cantitate de lapte de tipul A
{ for(k=0;k<=T/a[i]&&k<=j;k++) //incerc sa continuu fiecare rezultat anterior
{ if(dp[i-1][j-k]<0) continue;
int cost_a=k*a[i]; //timpul pentru a avea k litri de tipul A;
int litri_b=(T-cost_a)/b[i]; //cati litri de tipul B poate sa bea al-i-lea concurent
if(dp[i][j]<dp[i-1][j-k]+litri_b)
{ dp[i][j]=dp[i-1][j-k]+litri_b;
drum[i][j]=k;
}
}
}
}
if(dp[n][L]>=L)
{ int nr=L;
for(i=n;i>=1;i--)
{ rez[i].x=drum[i][nr];
rez[i].y=(T-rez[i].x*a[i])/b[i];
nr-=rez[i].x;
}
return 1;
}
return 0;
}
int rezolva()
{ int st=0,dr=105,sol=0;
while(st<=dr)
{ int mij=(st+dr)/2;
if(verif(mij)) {sol=mij; dr=mij-1;} else st=mij+1;
}
return sol;
}
int main()
{ f>>n>>L;
for(int i=1;i<=n;i++) f>>a[i]>>b[i];
g<<rezolva()<<"\n";
for(int i=1;i<=n;i++) g<<rez[i].x<<" "<<rez[i].y<<"\n";
g.close(); return 0;
}