Cod sursa(job #2321834)

Utilizator georgitTreista Georgiana georgit Data 16 ianuarie 2019 18:00:56
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#define MAX 10000000
#define N 17

using namespace std;

pair <int, long long> dp[(1<<N)+5];
long long a[N+5];
ifstream f("zebughil.in");
ofstream g("zebughil.out");
void solve()
{
    int n;
    long long G;
    f>>n>>G;
    for(int i=1;i<(1<<n);i++)
        dp[i].first=MAX;
    for(int i=1;i<=n;i++)
    {
        f>>a[i];
        dp[(1<<(i-1))].first=1;
        dp[(1<<(i-1))].second=G-a[i];
    }
    for(int i=1;i<(1<<n);i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(!(i&(1<<(j-1)))) continue;

            int aux=(i^(1<<(j-1)));
            if(dp[aux].second>=a[j])
            {
                if(dp[aux].first==dp[i].first)
                    dp[i].second=max(dp[aux].second-a[j],dp[i].second);
                if(dp[aux].first<dp[i].first)
                    dp[i]=make_pair(dp[aux].first,dp[aux].second-a[j]);
            }
            else
            {
                if(dp[aux].first+1==dp[i].first)
                    dp[i].second=max(G-a[j],dp[i].second);
                if(dp[aux].first+1<dp[i].first)
                    dp[i]=make_pair(dp[aux].first+1,G-a[j]);
            }
        }
    }
    g<<dp[(1<<n)-1].first<<"\n";
}
int main()
{
    for(int t=1;t<=3;t++)
        solve();
    return 0;
}