Pagini recente » Cod sursa (job #2393725) | Cod sursa (job #1592777) | Cod sursa (job #2426650) | Cod sursa (job #2985375) | Cod sursa (job #1897403)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 105;
int N, L, st, dr, mid, t1[Nmax], t2[Nmax], dp[Nmax][Nmax], i, r[Nmax][Nmax];
bool solution(int val)
{
int i, j, k;
for(i=0; i<=N; ++i)
for(j=0; j<=L; ++j)
dp[i][j] = -20005;
dp[0][0] = 0;
for(i=1; i<=N; ++i)
for(j=0; j<=L && j*t1[i]<=val; ++j)
for(k=0; j+k<=L; ++k)
{
int nr = dp[i-1][k]+(val-j*t1[i])/t2[i];
if(dp[i][k+j] < nr)
dp[i][k+j] = nr, r[i][k+j] = j;
}
return dp[N][L] >= L;
}
void print_solution(int n, int k)
{
printf("%d %d\n", r[n][k], (st-t1[n]*r[n][k]) / t2[n]);
if(n-1) print_solution(n-1, k-r[n][k]);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d%d", &N, &L);
for(i=N; i; --i)
scanf("%d%d", &t1[i], &t2[i]);
st = 1; dr = 20000;
while(st<=dr)
{
mid = (st+dr)/2;
if(solution(mid)) dr = mid-1;
else st = mid+1;
}
printf("%d\n", st);
solution(st);
print_solution(N, L);
return 0;
}