Cod sursa(job #1896452)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 28 februarie 2017 18:20:25
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 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;

    while(x>0){
        aux.a=last[x][y];
        aux.b=(T-aux.a*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=0;T<=100;T++){
        for(i=0;i<=n;i++)
            for(j=0;j<=L;j++) d[i][j]=-10000000;
        d[0][0]=0;

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

        if(d[n][L]>=L){
            print();
            break;
        }
    }

    return 0;
}