Pagini recente » Cod sursa (job #2803198) | Cod sursa (job #1694760) | Cod sursa (job #3158098) | Cod sursa (job #3255442) | Cod sursa (job #592037)
Cod sursa(job #592037)
#include<fstream>
#define INF 0x3f3f3f3f
using namespace std;
int N,L,M[202][202],last[202][202],T;
struct bla
{
int Ta,Tb;
}v[101];
ofstream g("lapte.out");
int dinamica(int t)
{
int i,j,k,V;
last[4][2] = 1;
memset(last,0,sizeof(last));
memset(M,0,sizeof(M));
for(i=0;i<=2*L+2;++i)
for(j=0;j<=2*L+2;++j)
M[i][j] = -INF;
M[0][0] = 0;
for(i=0;i<=N-1;++i)
for(j=0;j<=L;++j)
for(k=0;k<=L;++k)
if(M[i][j]!=-INF && v[i+1].Ta * k<=t)
{
V = (t - v[i+1].Ta*k)/v[i+1].Tb;
if(M[i+1][j+k] < M[i][j] + V)
{
M[i+1][j+k] = M[i][j] + V;
last[i+1][j+k] = k;
}
}
return (M[N][L] >= L);
}
void drum(int l,int c)
{
if(!l)return;
drum(l-1,c-last[l][c]);
g<<last[l][c]<<" "<<(T-v[l].Ta*last[l][c])/v[l].Tb<<"\n";
}
int main()
{
ifstream f("lapte.in");
f>>N>>L;
int i;
for(i=1;i<=N;++i)
f>>v[i].Ta>>v[i].Tb;
f.close();
int l=0,r=102,mid,x=0;
while(l<=r)
{
mid = (l+r)/2;
x = dinamica(mid);
if(x)
{
T = mid;
r = mid-1;
}
else
l = mid+1;
}
x = dinamica(T);
g<<T<<"\n";
drum(N,L);
g.close();
return 0;
}