Pagini recente » Cod sursa (job #701442) | Cod sursa (job #3000220) | Cod sursa (job #3202127) | Cod sursa (job #1969873) | Cod sursa (job #3265823)
#include <fstream>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int dp[109][109], cost1[109], cost2[109], ant[109][109];
void afis (int n, int l)
{
if (n>=1)
{
afis (n-1, ant[n][l]);
g << l-ant[n][l] << ' ' << dp[n][l]-dp[n-1][ant[n][l]]<<'\n';
}
}
int main ()
{
int n, l;
f >> n >> l;
for (int i=1; i<=n; i++)
f >> cost1[i] >> cost2[i];
int st=1, dr=1e4, retine=0;
while (st<=dr)
{
int t=(st+dr)/2;
for (int i=0; i<=n; i++)
for (int j=0; j<=l; j++)
dp[i][j]=-1;
dp[0][0]=0;
for (int i=1; i<=n; i++)
{
for (int latotal=0; latotal<=l; latotal++)
{
if (dp[i-1][latotal]!=-1)
{
for (int la=0; la<=min(l, t/cost1[i]); la++)
{
int lb=(t-cost1[i]*la)/cost2[i];
dp[i][min(latotal+la,l)]=max(dp[i][min(latotal+la,l)],dp[i-1][latotal]+lb);
}
}
}
}
if (dp[n][l]>=l)
{
retine=t;
dr=t-1;
}
else st=t+1;
}
g << retine <<'\n';
for (int i=0; i<=n; i++)
for (int j=0; j<=l; j++)
dp[i][j]=-1;
dp[0][0]=0;
int t=retine;
for (int i=1; i<=n; i++)
{
for (int latotal=0; latotal<=l; latotal++)
{
if (dp[i-1][latotal]!=-1)
{
for (int la=0; la<=min(l, t/cost1[i]); la++)
{
int lb=(t-cost1[i]*la)/cost2[i];
if (dp[i][min(latotal+la, l)]<dp[i-1][latotal]+lb)
{
dp[i][min(latotal+la, l)]=dp[i-1][latotal]+lb;
ant[i][min(latotal+la, l)]=latotal;
}
}
}
}
}
afis(n,l);
}