Cod sursa(job #2849424)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 15 februarie 2022 09:47:39
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 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;
        if (n > 1)
        {
            for (int i = 0; i < n; i++)
            fin >> a[i];
            for (int i = 0; i < (1 << n); i++)
                  dp[i] = {2e9, 2e9};
            dp[0] = {0, 0};
            for (int i = 0; i < (1 << n); i++)
                for (int k = 0; k < n; k++)
                {
                    if (i + (1 << k) <= (1 << n))
                    {
                        if (1LL * (dp[i].second + a[k]) <= G)
                        {
                            if (dp[i + k].first > dp[i].first)
                                dp[i + k] = {dp[i].first, dp[i].second + a[k]};
                            else if (dp[i + k].first == dp[i].first && 1LL * (dp[i].second + a[k]) < dp[i + k].second)
                                dp[i + k] = {dp[i].first, dp[i].second + a[k]};
                        }
                        else
                        {
                            if (dp[i + k].first > dp[i].first + 1)
                                dp[i + k] = {dp[i].first + 1, a[k]};
                            else if (dp[i + k].first == dp[i].first + 1 && a[k] < dp[i + k].second)
                                dp[i + k] = {dp[i].first + 1, a[k]};
                        }
                    }
                }
            fout << dp[(1 << n) - 1].first << "\n";
        }
        else fout << "1\n";
    }


    return 0;
}