Pagini recente » Cod sursa (job #2685073) | Cod sursa (job #820198) | Borderou de evaluare (job #1873139) | Cod sursa (job #2113207) | Cod sursa (job #3312973)
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
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] = -1e9;
dp[0][0] = 0;
for(i=1;i<=n;i++){
for(j=0;j<=l;j++){
x = (l-j) * a[i];
for(k=0;k*a[i] <= min(t, x);k++){
x2 = (t-k* a[i]) / b[i];
a2 = min(l, j+k);
dp[i][a2] = max (dp[i][a2], dp[i-1][j] + x2);
}
}
}
if(dp[n][l] < l)
return false;
return true;
}
void Refacere_solutie(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] = -1e9;
dp[0][0] = 0;
for(i=1;i<=n;i++){
for(j=0;j<=l;j++){
x = (l-j) * a[i];
for(k=0;k*a[i] <= min(t, x);k++){
x2 = (t-k* a[i]) / b[i];
a2 = min(l, j+k);
if(dp[i-1][j] + x2 > dp[i][x2]){
dp[i][x2] = dp[i-1][j] + x2;
drum[i][x2] = j;
}
}
}
}
}
vector<pair<int,int>> vrez;
void Refacere_drum(int i,int j){
if(i<1)
return;
Refacere_drum(i-1, drum[i][j]);
fout << j - drum[i][j] << " " << dp[i][j] - dp[i-1][drum[i][j]] << '\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=102, mij;
while(st <= dr){
mij = (st+dr)/2;
if(Posibil(mij)){
rez = mij;
dr = mij-1;
}
else
st = mij+1;
}
fout << rez << '\n' ;
Refacere_solutie(rez);
Refacere_drum(n, l );
}