Cod sursa(job #1528878)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 20 noiembrie 2015 10:35:24
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<cstdio>
using namespace std;
int n,l;
int a[110],b[110],dp[110][110],how[110][110],ans;
int verify(int t){
    int i,j,k;
    for(i=0;i<=n;i++){
        dp[i][0]=0;
        for(j=1;j<=l;j++)
            dp[i][j]=-2000000000;
    }
    for(i=1;i<=n;i++)
        for(k=0;k<=t/a[i];k++)
            for(j=l;j>=k;j--)
                if(dp[i][j]<dp[i-1][j-k]+(t-k*a[i])/b[i]){
                    dp[i][j]=dp[i-1][j-k]+(t-k*a[i])/b[i];
                    how[i][j]=k;
                }
    if(dp[n][l]>=l)
        return 1;
    return 0;
}
void build_solution(int person,int liters){
    if(person==0)
        return;
    build_solution(person-1,liters-how[person][liters]);
    printf("%d %d\n",how[person][liters],(ans-a[person]*how[person][liters])/b[person]);
}
int main(){
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    int i,l1,l2,m;
    scanf("%d%d",&n,&l);
    for(i=1;i<=n;i++)
        scanf("%d%d",&a[i],&b[i]);
    l1=1;
    l2=100;
    while(l1<=l2){
        m=(l1+l2)/2;
        if(verify(m)==1){
            l2=m-1;
            ans=m;
        }
        else
            l1=m+1;
    }
    printf("%d\n",ans);
    build_solution(n,l);
    return 0;
}