Pagini recente » Cod sursa (job #247081) | Cod sursa (job #2798307) | Cod sursa (job #1675767) | Cod sursa (job #801499) | Cod sursa (job #2769446)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("lapte.in");
ofstream g ("lapte.out");
int n;
int L;
int dp[105][205];
struct copil
{
int ta, tb;
};
copil a[105];
void verif(int timp)
{
dp[0][0]=0;
for(int i=1; i<=n; ++i)
{
for(int la=0; la<=L; ++la)
{
for(int lapte1=0; lapte1<=la && lapte1<=timp/a[i].ta; ++lapte1)
{
int x=lapte1;
int y=(timp-x*a[i].ta)/a[i].tb;
if(dp[i][la]< dp[i-1][la-x]+y)
dp[i][la]=max(dp[i][la], dp[i-1][la-x]+y);
}
}
}
}
int main()
{
f>>n;
f>>L;
for(int i=1; i<=n; ++i)
{
f>>a[i].ta>>a[i].tb;
}
int st=1;
int dr=L;
int mij=(st+dr)/2;
int rasp=0;
while(st<=dr)
{
for(int i=0; i<=n; ++i)
for(int j=0; j<=2*L; ++j)
dp[i][j]=-99999999;
verif(mij);
int ok=0;
for(int i=L; i<=2*L; ++i)
if(dp[n][i]>=L)
ok=1;
if(ok==1)
{
rasp=mij;
dr=mij-1;
}
else
st=mij+1;
mij=(st+dr)/2;
}
g<<rasp<<"\n";
for(int i=0; i<=n; ++i)
for(int j=0; j<=2*L; ++j)
dp[i][j]=-9999999;
verif(rasp);
int ajuns=0;
for(int i=L; i<=2*L; ++i)
if(dp[n][i]>=L)
{
ajuns=i;
break;
}
copil raspuns[1005];
for(int i=n-1; i>=0; --i)
{
for(int lapte1=0; lapte1<=rasp/a[i+1].ta; ++lapte1)
{
int x=lapte1;
int y=(rasp-x*a[i+1].ta)/a[i+1].tb;
if(dp[i][ajuns-x]+y==dp[i+1][ajuns])
{
ajuns=ajuns-x;
raspuns[i+1].ta=x;
raspuns[i+1].tb=y;
break;
}
}
}
for(int i=1; i<=n; ++i)
g<<raspuns[i].ta<<" "<<raspuns[i].tb<<"\n";
/*
18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0
22 22 21 21 20 20 19 19 18 18 17 16 15 14 13 12 11 10 9 8 7 6 5
25 25 24 24 24 24 24 24 23 23 23 23 23 23 22 22 22 22 22 22 21 21 20
*/
return 0;
}