Pagini recente » Cod sursa (job #285531) | sandwich | Cod sursa (job #1032847) | Cod sursa (job #1102745) | Cod sursa (job #3313115)
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
const int inf = 1e9;
int n, l, a[102], b[102];
int dp[302][302], drum[300][300];
bool Posibil(int t){
int i, j, x, y, k, x2, a2;
for(i=0;i<=n;i++)
for(j=0;j<=l;j++)
dp[i][j] = -inf;
dp[0][0] = 0;
for(j=0;j<=l && j*a[1] <= t;j++){
dp[1][j] = (t-j*a[1]) / b[1];
}
for(i=2;i<=n;i++){
for(j=0;j<=l;j++){
for(k=0;k<=j;k++){
if(dp[i-1][k] != -inf &&(j-k)*a[i] <=t)
dp[i][j] = max(dp[i][j],dp[i-1][k] + ( (t-(j-k)*a[i]) / b[i] ) );
}
}
}
if(dp[n][l] < l)
return false;
return true;
}
void Refacere_drum(int t){
int i, j, x, y, k, x2, a2;
for(i=0;i<=n;i++)
for(j=0;j<=l;j++)
dp[i][j] = -inf;
dp[0][0] = 0;
for(j=0;j<=l && j*a[1] <= t;j++){
dp[1][j] = (t-j*a[1]) / b[1];
}
for(i=2;i<=n;i++){
for(j=0;j<=l;j++){
for(k=0;k<=j;k++){
if(dp[i-1][k] != -inf &&(j-k)*a[i] <=t)
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] );
drum[i][j] = k;
}
}
}
}
}
void Refacere_sol(int lin, int col) {
if (lin == 0) return;
int prev = drum[lin][col];
Refacere_sol(lin - 1, prev);
int cant = col - prev;
int transp = (dp[lin][col] - dp[lin - 1][prev]);
fout << cant << " " << transp << '\n';
}
int main(){
int i, rez = -1;
fin >> n >> l;
for(i=1;i<=n;i++)
fin >> a[i] >> b[i];
int st=1, dr=100, mij;
while(st <= dr){
mij = (st+dr)/2;
if(Posibil(mij)){
rez = mij;
dr = mij-1;
}
else
st = mij+1;
}
fout << rez << '\n' ;
Refacere_drum(rez);
Refacere_sol(n,l);
}