Pagini recente » Cod sursa (job #1639532) | Cod sursa (job #1625991) | Cod sursa (job #1080678) | Cod sursa (job #1515430) | Cod sursa (job #2786453)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int maxN=100, mic = -10000;
struct bautor {
int a, b;
}v[maxN + 5], c[maxN + 5];
int st, dr, n, L, dp[maxN + 5][maxN + 5], ans=0x3f3f3f3f, lb, la;
bool valid(int t)
{
dp[0][0]=0;
for(int j = 1; j <= L; j++)
dp[0][j] = mic;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= L; j++)
{
dp[i][j]=mic;
for(int k = 0; k <= min(j, t/v[i].a); k++)
{
int val = (t - (k * v[i].a))/v[i].b;
dp[i][j] = max(dp[i][j], val + dp[i-1][j-k]);
}
}
}
/* fout<<t<<'\n';
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= L; j++)
fout << dp[i][j]<< ' ';
fout<<'\n';
} */
/// fout<<'\n';
return dp[n][L] >= L;
}
int main()
{
fin >> n >> L;
for(int i = 1; i <= n; i++)
fin >> v[i].a >> v[i].b;
st = 1;
dr = 100;
while(st <= dr)
{
int med = (st + dr)/2;
if(valid(med))
{
ans = min(ans, med);
dr = med - 1;
}
else
st = med + 1;
}
fout << ans << '\n';
valid(ans);
int la = L, lb = L;
for(int i = n; i > 0; i--)
{
for(int j = 0; j <= min(la, ans/v[i].a); j++)
{
int val = (ans - (j * v[i].a))/v[i].b;
if(dp[i-1][la - j] + val >= lb)
{
c[i].a = j;
c[i].b = val;
la = la - j;
lb = lb - val;
break;
}
}
}
for(int i = 1; i <= n; i++)
fout<<c[i].a<<' '<<c[i].b<<'\n';
return 0;
}