Pagini recente » Cod sursa (job #3190369) | Cod sursa (job #2670034) | Cod sursa (job #2152827) | Cod sursa (job #3240074) | Cod sursa (job #1359119)
#include<fstream>
using namespace std;
int n, p, u, mid, i, j, k, L, bl;
int a[101], b[101], d[101][101];
pair<int, int> 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] = -1000000000;
}
}
d[0][0] = 0;
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];
d[i][j] = max(d[i][j], bl + d[i-1][j-k]);
}
}
}
if(d[n][L] >= 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(int i = 0; i <= n; i++){
for(int j = 0; j <= L; j++){
d[i][j] = -1000000000;
}
}
d[0][0] = 0;
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(bl + d[i-1][j-k] > d[i][j]){
d[i][j] = bl + d[i-1][j-k];
t[i][j].first = k;
t[i][j].second = bl;
}
}
}
}
drum(n, L);
return 0;
}