Pagini recente » Cod sursa (job #2553485) | Cod sursa (job #3165641) | Cod sursa (job #1004840) | hlo_cj_av_l2 | Cod sursa (job #1572340)
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define nmax 110
using namespace std;
struct date { int x,y; };
int n,k,st,dr,sol;
int dp[nmax][nmax],path[nmax][nmax];
date t[nmax];
// dp[i][j] nr maxim de litri de lapte cei pot bea din sticla B daca
// au baut deja i prieteni si sau baut j litri din sticla A.
bool ok(int x)
{
memset(dp,-1,sizeof(dp));
memset(path,0,sizeof(path));
dp[0][0]=0;
for (int i=1;i<=n;i++) {
for (int j=0;j<=k;j++)
if (dp[i-1][j]>=0) {
for (int l=0;l+j<=k;l++)
if ((x-l*t[i].x)>=0) {
if (dp[i][j+l]<dp[i-1][j]+(x-l*t[i].x)/t[i].y) {
dp[i][j+l]=dp[i-1][j]+(x-l*t[i].x)/t[i].y;
path[i][j+l]=j;
}
} else break;
}
}
return (dp[n][k]>=k);
}
void findpath(int lv,int x)
{
if (lv==0) return; else
{
findpath(lv-1,path[lv][x]);
int dif=x-path[lv][x];
printf("%d %d\n",dif,dp[lv][x]-dp[lv-1][path[lv][x]]);
}
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d",&n,&k);
for (int i=1;i<=n;i++) scanf("%d %d",&t[i].x,&t[i].y);
st=1; dr=50000;
while (st<=dr) {
int m=(st+dr)/2;
if (ok(m)) {
sol=m; dr=m-1;
} else st=m+1;
}
ok(sol);
printf("%d\n",sol);
findpath(n,k);
return 0;
}