Cod sursa(job #3191095)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 8 ianuarie 2024 19:55:52
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>

#pragma GCC optimize ("O1")
#pragma GCC optimize ("O2")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target ("avx2")

using namespace std;

const long long max_size = 20, max_c = (1 << 17) + 20, INF = 1e18 + 1;

pair <int, long long> dp[max_c];
/// first - numaru de camioane minim pt conf, second - restu minim pt nr min camioane
long long v[max_c];

void solve ()
{
    long long n, w;
    cin >> n >> w;
    for (long long i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    for (long long i = 1; i < (1 << n); i++)
    {
        dp[i].first = n + 1;
    }
    dp[0].first = 1;
    for (long long i = 0; i < (1 << n); i++)
    {
        for (long long j = 0; j < n; j++)
        {
            if ((i & (1 << j)) != 0)
            {
                continue;
            }
            long long ct = dp[i].first, val = dp[i].second + v[j + 1];
            if (val > w)
            {
                val = v[j + 1];
                ct++;
            }
            dp[(i ^ (1 << j))] = min(dp[(i ^ (1 << j))], {ct, val});
        }
    }
    cout << dp[(1 << n) - 1].first;
    cout << '\n';
}

signed main ()
{
    #ifdef LOCAL
      freopen("test.in", "r", stdin);
      freopen("test.out", "w", stdout);
    #else
      freopen("zebunghil.in", "r", stdin);
      freopen("zebunghil.out", "w", stdout);
    #endif // LOCAL
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long t;
    //cin >> t;
    t = 3;
    while (t--)
    {
        solve();
    }
    return 0;
}