Pagini recente » Cod sursa (job #478357) | Cod sursa (job #2688607) | Cod sursa (job #2387217) | Cod sursa (job #670839) | Cod sursa (job #3191204)
#include <iostream>
#include <fstream>
#include <climits>
#define N_MAX 104
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
/// rezultatele cerute sunt valorile (like preturile obiectelor), si ce mi se da sunt grautatile
int n, l, La[N_MAX], Lb[N_MAX];
int dp[N_MAX][N_MAX];
pair <int, int> ans[N_MAX];
bool verif (int t){
for (int i=0; i<=n; ++i)
for (int j=0; j<=l; ++j)
dp[i][j] = INT_MIN;
dp[0][0] = 0;
for (int i=1; i<=n; ++i){
for (int j=0; j<=l; ++j){
for (int a=0; a<=t/La[i]; ++a){
int b = (t - La[i] * a) / Lb[i];
dp[i][j] = max (dp[i][j], dp[i-1][max(0, j-a)] + b);
}
}
}
if (dp[n][l] >= l)
return true;
return false;
}
int binarySearch (){
int st = 1, dr = 100, mid;
while (st != dr){
mid = (st+dr)/2;
if (verif(mid) == true)
dr = mid;
else
st = mid + 1;
}
return dr;
}
void getAns (int t){
verif(t);
int index = l;
for (int i=n; i>=1; --i){
for (int a=0; a<=t/La[i]; ++a){
int b = (t - La[i] * a) / Lb[i];
if (index - a >= 0 && dp[i-1][index-a] + b == dp[i][index]){
ans[i].first = a;
ans[i].second = b;
}
}
index -= ans[i].first;
}
for (int i=1; i<=n; ++i)
out << ans[i].first << ' ' << ans[i].second << '\n';
}
int main (){
in >> n >> l;
for (int i=1; i<=n; ++i)
in >> La[i] >> Lb[i];
int Lans = binarySearch();
getAns(Lans);
return 0;
}