Pagini recente » Cod sursa (job #2010735) | Monitorul de evaluare | Cod sursa (job #987890) | Monitorul de evaluare | Cod sursa (job #2951831)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n , L , T;
int tA[105] , tB[105];
int dp[105][105]; ///dp[i][lapteA] = cantitatea maxima de lapteB pe care o pot bea primele i persoane daca beau lapteA
vector < pair < int , int > > ans;
void init(){
for(int i = 0 ; i <= n ; ++i)
for(int j = 0 ; j <= L ; ++j)
dp[i][j] = -2000000000;
}
bool check(int T){
init();
dp[0][0] = 0;
for(int i = 1 ; i <= n ; ++i){
for(int j = 0 ; j <= L ; ++j){
for(int la = 0 ; la <= T / tA[i] ; ++la){
int lb = (T - la * tA[i]) / tB[i];
dp[i][j] = max(dp[i][j] , dp[i - 1][max(0 , j - la)] + lb);
}
}
}
if(dp[n][L] >= L)
return 1;
return 0;
}
void recon(){
init();
dp[0][0] = 0;
for(int i = 1 ; i <= n ; ++i){
for(int j = 0 ; j <= L ; ++j){
for(int la = 0 ; la <= T / tA[i] ; ++la){
int lb = (T - la * tA[i]) / tB[i];
dp[i][j] = max(dp[i][j] , dp[i - 1][max(0 , j - la)] + lb);
}
}
}
int i = n , j = L;
int ans1 , ans2 , k;
while(i >= 1){
for(int la = 0 ; la <= T / tA[i] ; ++la){
int lb = (T - la * tA[i]) / tB[i];
if(j - la >= 0 && dp[i - 1][j - la] + lb == dp[i][j]){
ans1 = la;
ans2 = lb;
k = la;
}
}
j -= k;
--i;
ans.push_back({ans1 , ans2});
}
reverse(ans.begin() , ans.end());
for(auto it : ans)
g << it.first << " " << it.second << "\n";
}
int main()
{
f >> n >> L;
for(int i = 1 ; i <= n ; ++i)
f >> tA[i] >> tB[i];
int left = 1 , right = 100;
while(left <= right){
int m = (left + right) / 2;
if(check(m)){
T = m;
right = m - 1;
}
else left = m + 1;
}
g << T << "\n";
recon();
return 0;
}