Pagini recente » Cod sursa (job #926751) | Cod sursa (job #434721) | Cod sursa (job #1207146) | Rating Onete Paul (IcestrikeR) | Cod sursa (job #742884)
Cod sursa(job #742884)
#include <fstream>
#include <iostream>
#define nmax 105
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, L, dp[nmax][nmax], a[nmax], b[nmax];
int drum[nmax][nmax];
struct{
int x, y;
}rez[nmax];
void citeste(){
f >> n >> L;
for(int i=1; i<=n; i++) f >> a[i] >> b[i];
}
bool verif(int T){
for(int i=0; i<=n; i++) for(int j=1; j<=L; j++) dp[i][j] = -1, drum[i][j] = 0;
for(int 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(int i=1; i<=n; i++){//i-au fiecare concurent
for(int j=0; j<=L; j++){//pentru fiecare cantitate de lapte de tipul A
for(int k=0; k<=T/a[i] && k<=j; k++){//incerc sa continuu fiecare rezultat anterior
if (dp[i-1][j-k] < 0) continue;
//if (i == 1 && k<j) 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(int 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;
int dr = 105;
int 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(){
citeste();
g << rezolva() << "\n";
for(int i=1; i<=n; i++){
g << rez[i].x << " " << rez[i].y << "\n";
}
f.close();
g.close();
return 0;
}