Cod sursa(job #1896408)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 28 februarie 2017 17:57:14
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

const int N=105;
int n,L,A[N],B[N],T,d[N][N],last[N][N],val,x,y;
struct sol{
    int a,b;
} aux;
stack <sol> st;

void print(){
    printf("%d\n",T);
    x=n, y=L;
    int k;

    while(x!=0){
        k=last[x][y];
        aux.a=k;
        aux.b=(T-k*A[x])/B[x];
        st.push(aux);
        x--, y-=aux.a;
    }
    while(!st.empty()){
        printf("%d %d\n",st.top().a,st.top().b);
        st.pop();
    }
}

int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);

    int i,j,k;
    scanf("%d%d",&n,&L);
    for(i=1;i<=n;i++) scanf("%d%d",&A[i],&B[i]);

    for(T=1;T<=100;T++){
        for(i=1;i<=n;i++)
            for(j=0;j<=L;j++) d[i][j]=0;

        for(i=1;i<=n;i++){
            for(j=0;j*A[i]<=T;j++){
                for(k=L;k>=0;k--){
                    if(i==1 and k-j!=0) continue;
                    if(j>k) continue;
                    val=d[i-1][k-j]+(T-j*A[i])/B[i];
                    if(val>d[i][k]){
                        d[i][k]=val;
                        last[i][k]=j;
                    }
                }
            }
        }
        if(d[n][L]>=L){
            print();
            break;
        }
    }

    return 0;
}