Cod sursa(job #3191093)

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

using namespace std;

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

pair <long long, 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 = INF;
    }
    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;
}