Pagini recente » Cod sursa (job #349067) | Cod sursa (job #2781286) | Cod sursa (job #1410999) | Cod sursa (job #1085726) | Cod sursa (job #2793081)
#include <iostream>
#include <fstream>
#include <algorithm>
#define nmax 105
using namespace std;
int a[nmax],b[nmax],n,l,ba[nmax][nmax],bb[nmax][nmax];
int solve (int t)
{
int dp[nmax][nmax];
// dp[i][j] = nr maxim de litri de B pe care poti sa ii bei cu primii i participanti
// daca bei j litri de A
// Daca dp[3][5] = 2, inseamna ca cu primii 3 participanti,
// pentru 5 litri de A bauti, mai poti sa bei maxim 2 litri de B
for (int i=0;i<=n;i++)
for (int j=0;j<=l;j++)
dp[i][j] = -(1<<20);
dp[0][0] = 0;
for (int i=1;i<=n;i++)
for (int la=0;la * a[i]<=t;la++)
{
int lb=(t-a[i]*la) / b[i];
for (int j=0;j<=l-la;j++)
{
// dp[i-1][j] + lb => dp[i][j+la]
if (dp[i-1][j] + lb > dp[i][j + la])
{
dp[i][j + la] = dp[i-1][j] + lb;
ba[i][j + la] = la;
bb[i][j + la] = lb;
}
}
}
return dp[n][l] >= l;
}
// (i - 1, j, dp[i - 1][j])
// (i, j + la, dp[i - 1][j] + lb)
//
int main()
{
ifstream f ("lapte.in");
ofstream g ("lapte.out");
f>>n>>l;
int i,j,st,mid,dr,sol;
for (i=1;i<=n;i++)
{
f >> a[i] >> b[i];
}
st=1;
dr=20000;
while (st<=dr)
{
mid=(st+dr)/2;
if (solve(mid))
{
sol=mid;
dr=mid-1;
}
else
{
st=mid+1;
}
}
g<<sol << '\n';
solve(sol);
i = n, j = l;
int p[nmax], q[nmax];
while (i) {
//dp[i][j] (prima data esti in dp[n][l])
//ba[i][j] litri de a, bb[i][j] litri de b
p[i] = ba[i][j];
q[i] = bb[i][j];
j-= ba[i][j];
i--;
}
for (int i = 1; i <= n; i++) {
g << p[i] << ' ' << q[i] << '\n';
}
}