Pagini recente » Cod sursa (job #2460454) | Cod sursa (job #584363) | Cod sursa (job #768468) | Cod sursa (job #253978) | Cod sursa (job #420369)
Cod sursa(job #420369)
#include <iostream>
#include <conio.h>
using namespace std;
int N, L;
int A[101], B[101], La[101], Lb[101];
int P[101][101], M[101][101];
int Verifica(int timp) {
int i, j, p;
for(i=1; i<=N; i++) {
for(j=0; j<=timp/A[i]+1; j++) {
P[i][j]=(timp-j*A[i])/B[i];
}
}
for(i=0; i<=timp/A[1]+1; i++) {
if(i>=L) {
M[1][L]=max(M[1][L], P[1][i]);
continue;
}
M[1][i]=P[1][i];
}
for(i=2; i<=N; i++) {
for(j=0; j<=L; j++) {
for(p=0; p<=timp/A[i]+1; p++) {
//M[i-1][j], P[i][p]
if(p+j>=L) {
M[i][L]=max(M[i][L], M[i-1][j]+P[i][p]);
continue;
}
M[i][j+p]=max(M[i][j+p], M[i-1][j]+P[i][p]);
}
}
}
if(M[N][L]>=L) { return 1; }
return 0;
}
int main() {
FILE *f1=fopen("lapte.in", "r"), *f2=fopen("lapte.out", "w");
int i, j, p, sol=0, mla, mlb, ok=0;
fscanf(f1, "%d%d", &N, &L);
for(i=1; i<=N; i++) {
fscanf(f1, "%d%d", &A[i], &B[i]);
}
int ls=1, ld=102;
while(ls<=ld) {
int mij=(ls+ld)/2;
if(Verifica(mij)) {
//e posibil, deci caut un timp mai mic
sol=mij;
ld=mij-1;
}
else {
//timp mai mare
ls=mij+1;
}
for(i=1; i<=N; i++) {
for(j=0; j<=L; j++) {
P[i][j]=0; M[i][j]=0;
}
}
}
fprintf(f2, "%d\n", sol+1);
//reconstituiesc solutia
int timp=sol+1;
for(i=1; i<=N; i++) {
for(j=0; j<=timp/A[i]; j++) {
P[i][j]=(timp-j*A[i])/B[i];
}
}
for(i=0; i<=timp/A[1]; i++) {
M[1][i]=P[1][i];
}
for(i=2; i<=N; i++) {
for(j=0; j<=L; j++) {
for(p=0; p<=timp/A[i]; p++) {
if(p+j>=L) { M[i][p+j]=max(M[i][L], M[i-1][j]+P[i][p]); continue; }
M[i][p+j]=max(M[i][p+j], M[i-1][j]+P[i][p]);
}
}
}
mla=L; mlb=L;
for(i=N; i>=1; i--) {
for(j=0; j<=L; j++) {
for(p=0; p<=timp/A[i]; p++) {
if(i==N) {
if(j+p>=L && M[i-1][j]+P[i][p]>=L) {
//primele i-1 persoane tre sa bea exact (j, M[i-1][j]) litri
La[i]=p; Lb[i]=P[i][p];
mla=j; mlb=M[i-1][j];
ok=1; break;
}
}
else {
if(j+p==mla && M[i-1][j]+P[i][p]==mlb) {
//primele i-1 persoane tre sa bea exact (j, M[i-1][j]) litri
La[i]=p; Lb[i]=P[i][p];
mla=j; mlb=M[i-1][j];
ok=1; break;
}
}
}
if(ok) { ok=0; break; }
}
}
for(i=1; i<=N; i++) {
fprintf(f2, "%d %d\n", La[i], Lb[i]);
}
fclose(f1); fclose(f2);
return 0;
}