Cod sursa(job #2949989)

Utilizator Theo14Ancuta Theodor Theo14 Data 2 decembrie 2022 15:41:42
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("zebughil.in");
ofstream g("zebughil.out");

int n,k,v[19],p[21];
struct elem
{
    int nrcam,greutate;
}dp[177];
///dp[mask]=nr minim de camioane atunci cand consideram pietrele marcate cu 1 in stare si pentru acest minim si greutatea minima din ultimul camion

signed main()
{
    int i,l,mask;
    p[0]=1;
    for(i=1;i<=19;i++)
        p[i]=p[i-1]*2;
    for(l=1;l<=3;l++)
    {
        f>>n>>k;
        for(i=1;i<=n;i++)
            f>>v[i];
        for(mask=0;mask<=p[n]-1;mask++)
            dp[mask].nrcam=dp[mask].greutate=INF;
        for(i=1;i<=n;i++)
            dp[p[i-1]].nrcam=1,dp[p[i-1]].greutate=v[i];
        for(mask=1;mask<=p[n]-1;mask++)
        {
            for(i=1;i<=n;i++)
            {
                if((mask&p[i-1])==0)
                {
                    if(dp[mask].greutate+v[i]<=k)
                    {
                        if(dp[mask|p[i-1]].nrcam>dp[mask].nrcam)
                            dp[mask|p[i-1]].greutate=dp[mask].greutate+v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam;
                        else
                        if(dp[mask|p[i-1]].nrcam==dp[mask].nrcam && dp[mask|p[i-1]].greutate>dp[mask].greutate+v[i])
                            dp[mask|p[i-1]].greutate=dp[mask].greutate+v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam;
                    }
                    else
                    {
                        if(dp[mask|p[i-1]].nrcam>dp[mask].nrcam+1)
                            dp[mask|p[i-1]].greutate=v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam+1;
                        else
                        if(dp[mask|p[i-1]].nrcam==dp[mask].nrcam+1 && dp[mask|p[i-1]].greutate>v[i])
                            dp[mask|p[i-1]].greutate=v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam+1;
                    }
                }
            }
        }
        g<<dp[p[n]-1].nrcam<<'\n';
    }
    return 0;
}