Pagini recente » Cod sursa (job #300392) | Cod sursa (job #588167) | Cod sursa (job #2376615) | Cod sursa (job #1196272) | Cod sursa (job #998787)
Cod sursa(job #998787)
#include <fstream>
#define maxn 101
using namespace std;
ifstream fin("lapte.in");
ofstream fout ("lapte.out");
int n,l;
int a[maxn],b[maxn];
int v[maxn][maxn],from[maxn][maxn];
int finala[maxn],finalb[maxn];
bool dp (int T)
{
for (int i=0; i<=n; ++i)
for (int j=0; j<=l; ++j)
v[i][j] = -1;
v[0][0]=0;
for (int i=1; i<=n; ++i)
{
for (int j=0; j<=l; ++j)
{
for (int k=0; k<=j; ++k)
{
if (k*a[i] > T) continue;
if (v[i-1][j-k]!=-1 && v[i-1][j-k] + (T-a[i]*k)/b[i] > v[i][j])
{
v[i][j] = v[i-1][j-k] + (T-a[i]*k)/b[i];
from[i][j] = k;
}
}
}
}
if (v[n][l] < l) return 1;
return 0;
}
int main()
{
fin>>n>>l;
for (int i=1; i<=n; ++i)
{
fin>>a[i]>>b[i];
}
int lo = -1, hi =maxn;
while (hi-lo > 1)
{
int mid = (lo+hi)/2;
if (dp(mid)) lo = mid;
else hi = mid;
}
fout<<hi<<"\n";
for (int i=n, j=l; i>=1; --i)
{
finala[i] = from[i][j];
finalb[i] = (hi - from[i][j]*a[i])/b[i];
j -= from[i][j];
}
for (int i=1; i<=n; ++i)
{
fout<<finala[i]<<" "<<finalb[i]<<"\n";
}
return 0;
}