Pagini recente » Cod sursa (job #24454) | Cod sursa (job #2447919) | Cod sursa (job #536179) | Istoria paginii runda/cartof125 | Cod sursa (job #593441)
Cod sursa(job #593441)
# include <cstdio>
# include <cstring>
const char *FIN = "lapte.in", *FOU = "lapte.out" ;
const int MAX = 105 ;
struct vec {
int a, b ;
} V[MAX] ;
int dp[MAX][MAX], rec[MAX][MAX] ;
int N, L ;
bool check (int X) {
memset (dp, -1, sizeof (dp)) ;
dp[0][0] = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 0; j <= L; ++j) {
for (int k = 0; k <= X / V[i].b && k <= j; ++k) {
if (dp[i - 1][j - k] != -1 && dp[i][j] < dp[i - 1][j - k] + (X - V[i].b * k) / V[i].a) {
dp[i][j] = dp[i - 1][j - k] + (X - V[i].b * k) / V[i].a ;
rec[i][j] = j - k;
}
}
}
}
return (dp[N][L] < L ? 0 : 1) ;
}
void tipar (int i, int j) {
if (i > 0) {
tipar (i - 1, rec[i][j]) ;
printf ("%d %d\n", dp[i][j] - dp[i - 1][rec[i][j]], j - rec[i][j]) ;
}
}
int main (void) {
freopen (FIN, "r", stdin) ;
scanf ("%d %d", &N, &L) ;
for (int i = 1; i <= N; ++i)
scanf ("%d %d", &V[i].a, &V[i].b) ;
int cnt, i ;
for (cnt = 1; cnt << 1 <= 100000; cnt <<= 1);
for (i = cnt + 1; cnt; cnt >>= 1)
if (i - cnt > 0 && check (i - cnt))
i -= cnt ;
freopen (FOU, "w", stdout) ;
printf ("%d\n", i) ;
check (i) ;
tipar (N, L) ;
}