Pagini recente » Cod sursa (job #2998717) | Cod sursa (job #2969905) | Cod sursa (job #1393203) | Cod sursa (job #2914576) | Cod sursa (job #2769440)
#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)
{
for(int lapte1=0; lapte1<=timp/a[1].ta; ++lapte1)
{
int x=lapte1;
int y=(timp-x*a[1].ta)/a[1].tb;
dp[1][x]=y;
}
for(int i=1; i<n; ++i)
{
for(int la=0; la<=L; ++la)
{
if(dp[i][la]!=0)
{
for(int lapte1=0; lapte1<=timp/a[i+1].ta; ++lapte1)
{
int x=lapte1;
int y=(timp-x*a[i+1].ta)/a[i+1].tb;
dp[i+1][la+x]=max(dp[i+1][la+x], dp[i][la]+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]=0;
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]=0;
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;
}