Cod sursa(job #2334226)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 2 februarie 2019 13:04:43
Problema Zebughil Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("zebughil.in");
ofstream out("zebughil.out");
const int N = 18;
long long v[N],dp[1<<N][N],best[1<<N][N];
int main()
{
    int t = 3;
    while (t--)
    {
        int n;
        long long g;
        in >> n >> g;
        for (int i = 0; i<(1<<n); i++)
            for (int j = 1; j<=n; j++)
                dp[i][j] = best[i][j] = 0;
        for (int i = 0; i<n; i++)
        {
            in >> v[i];
            dp[1<<i][1] = g-v[i];
            best[1<<i][1] = 1;
        }
        for (int i = 0; i<(1<<n); i++)
            for (int k = 0; k<n && i+(1<<k)<(1<<n); k++)
                if ((i&(1<<k)) == 0)
                    for (int j = 1; j<=n; j++)
                    {
                        if (dp[i][j]>=v[k])
                        {
                            if (1+best[i][j]>best[i+(1<<k)][j])
                            {
                                best[i+(1<<k)][j] = 1+best[i][j];
                                dp[i+(1<<k)][j] = dp[i][j]-v[k];
                            }
                        }
                        else
                        {
                            if (1+best[i][j]>best[i+(1<<k)][j+1])
                            {
                                dp[i+(1<<k)][j+1] = g-v[k];
                                best[i+(1<<k)][j+1] = 1+best[i][j];
                            }
                        }
                    }
        for (int i = 1; i<=n; i++)
            if (best[(1<<n)-1][i] == n)
            {
                out << i << "\n";
                break;
            }
    }
}