Pagini recente » Cod sursa (job #2218196) | Cod sursa (job #2654464) | Cod sursa (job #2115392) | Cod sursa (job #482193) | Cod sursa (job #1143102)
#include <fstream>
#define NMAX 200
#include <cstring>
using namespace std;
int D[NMAX][NMAX];
int P[NMAX][NMAX];
int A[NMAX],B[NMAX];
struct key{int a;int b;};
key L[NMAX];
int N,st,dr,mij,sol,l,i;
bool DINAMICA(int x)
{
int i,j,k;
memset(P,0,sizeof(P));
memset(D,0,sizeof(D));
for (i=0; i<=N; i++){
for (j=1; j<=l; j++)
D[i][j]=-1000000;
D[i][0]=0;
}
for (i=1; i<=N; i++){
for (j=0; j<=l; j++){
for (k=0; k<=min(x/L[i].a,j); k++)
if (D[i-1][j-k]!=-1 && D[i][j]<D[i-1][j-k]+(x-k*L[i].a)/L[i].b){
D[i][j]=D[i-1][j-k]+(x-k*L[i].a)/L[i].b;
P[i][j]=k;
}
}
}
if (D[N][l] >= l) return true;
return false;
}
int main()
{
ifstream f("lapte.in");
ofstream g("lapte.out");
f>>N>>l;
for (i=1;i<=N;i++) f>>L[i].a>>L[i].b;
st=0;dr=120;
while (st<=dr) {
mij=(st+dr)/2;
if (DINAMICA(mij)){
sol=mij;
dr=mij-1;
}
else
st=mij+1;
}
for (i=N;i>=1;i--){
A[i]=P[i][l];
l-=A[i];
B[i]=(sol-A[i]*L[i].a)/L[i].b;
}
g<<sol<<'\n';
for (i=1; i<=N; i++)
g<<A[i]<<" "<<B[i]<<'\n';
f.close();
g.close();
return 0;
}