Pagini recente » Cod sursa (job #1724360) | Cod sursa (job #1556337) | Cod sursa (job #1639895) | Cod sursa (job #664706) | Cod sursa (job #3293383)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l;
vector <vector <int>> dp;
vector <vector <int>> reza(105,vector<int>(105));
vector <pair <int,int>> c(105);
pair <int, int> solution[105];
/// dp[i][j] - cantitatea maxima de lapte 2 pe care o beau primii i copii, a.i sa bea SIGUR j litri de lapte 1
bool ok(int mij){
dp.assign(n+1,vector <int>(l+1,-1));
dp[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=l;j++)
for(int k=0;k<=j&&k*c[i].first<=mij;k++)
if(dp[i-1][j-k]>=0){
int nd=dp[i-1][j-k]+(mij-k*c[i].first)/c[i].second;
if(nd>dp[i][j]){
dp[i][j]=nd;
reza[i][j]=k;
}
}
return dp[n][l]>=l;
}
void afis()
{
for ( int i = 1; i <= n; ++i, fout << endl )
for ( int j = 1; j <= l; ++j )
fout << dp[i][j] << " ";
}
int main()
{
fin >> n >> l;
int i;
for ( i = 1; i <= n; ++i )
fin >> c[i].first >> c[i].second;
int st = 1, dr = 1000005, mij, sol = -1;
while ( st <= dr )
{
mij = (st + dr) / 2;
if ( ok(mij) == true )
{
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
fout << sol << '\n';
bool ceva = ok(sol);
// afis();
// fout << "----------------------------------------\n";
int s = l;
for ( i = n; i >= 1; --i )
{
solution[i] = {reza[i][s], (sol - reza[i][s] * c[i].first)/c[i].second};
s -= reza[i][s];
}
//fout << "-----------------------\n";
for ( i = 1; i <= n; ++i )
fout << solution[i].first << " " << solution[i].second << "\n";
return 0;
}