Pagini recente » Cod sursa (job #1275654) | Cod sursa (job #1997156) | Cod sursa (job #1418433) | Cod sursa (job #3163259) | Cod sursa (job #1452630)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define MAX 103
#define cout fout
vector <pair <int, int> > sol;
pair <int, int> x[MAX];
int a[MAX][MAX], dad[MAX][MAX];
int n, l;
bool rez(int time)
{
int i, j, k;
a[0][0] = 0;
for(j = 1 ; j <= l ; j++)
a[0][j] = -(1<<29);
for(i = 1 ; i <= n ; i++)
{
for(j = 0 ; j <= l ; j++)
{
a[i][j] = a[i - 1][j];
dad[i][j] = 0;
for(k = 0 ; k <= j && k * x[i].first <= time ; k++)
{
if(a[i][j] < a[i - 1][j - k] + (time - k * x[i].first) / x[i].second)
{
a[i][j] = a[i - 1][j - k] + (time - k * x[i].first) / x[i].second;
dad[i][j] = k;
}
}
}
}
return a[n][l] >= l;
}
void af()
{
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= l ; j++)
cout << a[i][j] << " ";
cout << "\n";
}
}
int main()
{
int i, st, dr, ok;
fin >> n >> l;
for (i = 1 ; i <= n ; i ++)
{
fin >> x[i].first >> x[i].second;
}
st = 0;
dr = 100;
while(st <= dr)
{
int mij = st + (dr - st) / 2;
if(rez(mij))
{
ok = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
cout << ok << "\n";
rez(ok);
int j;
j = l;
for(i = n ; i >= 1 ; i--)
{
sol.push_back(make_pair(dad[i][j], (ok - dad[i][j] * x[i].first) / x[i].second));
j -= dad[i][j];
}
for(vector <pair<int, int> > :: reverse_iterator it = sol.rbegin(); it != sol.rend() ; it++)
{
cout << it->first << " " << it->second << "\n";
}
}