Cod sursa(job #2849522)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 15 februarie 2022 12:07:39
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("zebughil.in");
ofstream fout ("zebughil.out");

int n, G;
int a[25];
pair <int, int> dp[132000]; /// dp[i].first = numarul minim de pachete, dp[i].second = suma ultimului camion

/// 1010111

int main()
{
    for (int j = 1; j <= 3; j++)
    {
        fin >> n >> G;
        for (int i = 0; i < n; i++)
            fin >> a[i];
        for (int i = 0; i < (1 << n); i++)
              dp[i] = {n, 2e9};
        dp[0] = {1, 0};
        /// 100, 011
        for (int i = 0; i < (1 << n); i++)
            for (int k = 0; k < n; k++)
            {
                if (i + (1 << k) <= (1 << n) && ((i & (1 << k)) == 0))
                {
                    int pos = i + (1 << k);
                    if (1LL * (dp[i].second + a[k]) <= G)
                    {
                        if (dp[pos].first > dp[i].first)
                            dp[pos] = {dp[i].first, dp[i].second + a[k]};
                        else if (dp[pos].first == dp[i].first && 1LL * (dp[i].second + a[k]) < dp[pos].second)
                            dp[pos] = {dp[i].first, dp[i].second + a[k]};
                    }
                    else
                    {
                        if (dp[pos].first > dp[i].first + 1)
                            dp[pos] = {dp[i].first + 1, a[k]};
                        else if (dp[pos].first == dp[i].first + 1 && a[k] < dp[pos].second)
                            dp[pos] = {dp[i].first + 1, a[k]};
                    }
                }
            }
        fout << dp[(1 << n) - 1].first << "\n";
    }


    return 0;
}