Cod sursa(job #3221424)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 7 aprilie 2024 08:53:29
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#ifndef LOCAL
    #pragma GCC optimize("O3")
    #pragma GCC target("avx2")
#endif

#ifdef LOCAL
    #define _GLIBCXX_DEBUG
#endif

#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define pii pair<int, int>
using ll = long long;
using ci = const int;
using cll = const long long;

using namespace std;

const int NMAX = 17;
const int MASCA_MAX = (1 << NMAX);
const int INF = 2e9 + 7;
/*******************************/
// INPUT / OUTPUT

#ifndef LOCAL
    ifstream in("zebughil.in");
    ofstream out("zebughil.out");
    #define cin in
    #define cout out
#endif
/*******************************/
/// GLOBAL DECLARATIONS

int T;
int N, G;
int w[NMAX];

pii dp[MASCA_MAX];
/*******************************/
/// FUNCTIONS

void ReadInput();
void Solution();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
    T = 3;
}
///-------------------------------------
inline void Reset()
{

}
///-------------------------------------
inline void Read()
{
    cin >> N >> G;
    for (int i = 0 ; i < N ; ++ i)
        cin >> w[i];
}
///-------------------------------------
inline void Solve()
{
    int masca_max = (1 << N);
    for (int i = 0 ; i < masca_max ; ++ i)
    {
        dp[i] = {INF, INF};
    }

    int masca_noua;
    dp[0] = {1, 0};
    for (int masca = 0 ; masca < masca_max ; ++ masca)
    {
        for (int bit = 0 ; bit < N ; ++ bit)
        {
            if (masca & (1 << bit))
            {
                masca_noua = (masca ^ (1 << bit));
                if (dp[masca_noua].second + w[bit] <= G)
                    dp[masca] = min(dp[masca], {dp[masca_noua].first, dp[masca_noua].second + w[bit]});
                else
                    dp[masca] = min(dp[masca], {dp[masca_noua].first + 1, w[bit]});
            }
        }
    }
}
///-------------------------------------
inline void Output()
{
    cout << dp[(1 << N) - 1].first << "\n";
}
///-------------------------------------
inline void TestCase()
{
    Reset();
    Read();
    Solve();
    Output();
}
///-------------------------------------
inline void Solution()
{
    while (T --)
    {
        TestCase();
    }
}
///-------------------------------------
signed main()
{
    #ifndef LOCAL
        ios::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    #endif
    ReadInput();
    Solution();
    return 0;
}