Pagini recente » Cod sursa (job #1930867) | Cod sursa (job #1213531) | Cod sursa (job #1912743) | Cod sursa (job #1501050) | Cod sursa (job #1358848)
#include <cstdio>
#include <fstream>
#define INF 2000000000
using namespace std;
int n, L, i, j, p, u, mid,nr, a[1100], b[1100], D[1100][1100],t[1100][110];
FILE *f, *g;
int verif(int T){
int S = 0, X, Y;
for(i = 0; i <= n; i ++)
{
for(j = 0; j <= L; j ++)
{
D[i][j] = -INF;
}
D[i][0] = 0;
}
for(i = 1; i <= n; i ++)
{
X = T / a[i];
for(int k = 0; k <= X; k ++)
{
Y = (T - k * a[i])/ b[i];
for(int j = L;j >= k; j --){
if(D[i][j]<D[i-1][j-k]+Y){
D[i][j] =D[i - 1][j - k] + Y;
t[i][j]=k;
}
}
}
}
if(D[n][L] >= L)
return 1;
return 0;
}
void path(int n,int L){
if(n==0)
return;
path(n-1,L-t[n][L]);
fprintf(g,"%d %d\n",t[n][L],(nr - a[n] * t[n][L])/ b[n]);
}
int main(){
f = fopen("lapte.in","r");
g = fopen("lapte.out","w");
fscanf(f,"%d%d",&n,&L);
for(i = 1;i <= n;i ++){
fscanf(f,"%d%d", &a[i], &b[i]);
}
p = 1;
u = 1000;
while(p <= u){
mid = (p + u) / 2;
if( !verif(mid) )
p = mid + 1;
else{
nr=mid;
u = mid - 1;
}
}
fprintf(g,"%d\n",nr);
verif(nr);
path(n,L);
fclose(f);
fclose(g);
return 0;
}