Pagini recente » Cod sursa (job #247001) | Cod sursa (job #1240619) | Cod sursa (job #469688) | Cod sursa (job #2564727) | Cod sursa (job #1358980)
#include<fstream>
using namespace std;
int n, p, u, mid, i, j, k, L, bl;
int a[101], b[101];
pair<int, int> d[101][101], t[101][101];
ifstream fin("lapte.in");
ofstream fout("lapte.out");
void drum(int i, int j){
if(i != 0){
drum(i - 1, j - t[i][j].first);
fout<< t[i][j].first <<" "<< t[i][j].second <<"\n";
}
}
int verif(int t){
for(int i = 0; i <= n; i++){
for(int j = 0; j <= L; j++){
d[i][j].first = d[i][j].second = 0;
}
}
d[0][0].second = 1;
for(int i = 1; i <= n; i++){
for(int k = 0; k <= t / a[i]; k++){
for(int j = k; j <= L; j++){
int bl = (t - a[i] * k) / b[i];
if(d[i-1][j-k].second == 1){
d[i][j].second = 1;
d[i][j].first = max(d[i][j].first, bl + d[i-1][j-k].first);
}
}
}
}
if(d[n][L].first >= L){
return 1;
}
return 0;
}
int main(){
fin>> n >> L;
for(i = 1; i <= n; i++){
fin>> a[i] >> b[i];
}
p = 1;
u = L * a[1] + L * b[1];
while(p <= u){
mid = (p + u) / 2;
if(verif(mid)){
u = mid - 1;
}
else{
p = mid + 1;
}
}
fout<< p <<"\n";
for(i = 0; i <= n; i++){
for(j = 0; j <= L; j++){
d[i][j].first = d[i][j].second = 0;
}
}
d[0][0].second = 1;
for(i = 1; i <= n; i++){
for(k = 0; k <= p / a[i]; k++){
for(j = k; j <= L; j++){
bl = (p - a[i] * k) / b[i];
if(d[i-1][j-k].second == 1){
d[i][j].second = 1;
if(d[i-1][j-k].first + bl > d[i][j].first){
d[i][j].first = d[i-1][j-k].first + bl;
t[i][j].first = k;
t[i][j].second = bl;
}
}
}
}
}
drum(n, L);
return 0;
}