Cod sursa(job #3225925)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 19 aprilie 2024 12:56:57
Problema Zebughil Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <utility>
#define N 17
#define MAX_MASK (1 << N)
#define INF (1 << 30)
#define ll long long

unsigned ll v[N];
std::pair <ll, ll> dp[MAX_MASK];
int n;

int main() {
    FILE *fin, *fout;
    ll w;

    fin = fopen("zebughil.in", "r");
    fout = fopen("zebughil.out", "w");
    for ( int q = 0; q < 3; q ++ ) {
        fscanf(fin, "%d%lld", &n, &w);
        for ( int i = 0; i < n; i ++ )
            fscanf(fin, "%lld", &v[i]);
        ll max_mask = (1LL << n) - 1;
        dp[0] = {0, 0};
        for ( ll mask = 1; mask <= max_mask; mask ++ ) {
            dp[mask] = {0, INF};
            for ( int bit = 0; bit < n; bit ++ ) {
                if ( ((mask >> bit) & 1) == 1 ) {
                    ll prev = mask - (1 << bit);
                    if ( dp[prev].first + v[bit] <= w ) {
                        if ( dp[prev].second < dp[mask].second )
                            dp[mask] = {dp[prev].first + v[bit], dp[prev].second};
                    }
                    else if ( dp[prev].second + 1 < dp[mask].second )
                        dp[mask] = {v[bit], dp[prev].second + 1};
                }
            }
        }
        fprintf(fout, "%lld\n", dp[max_mask].second + 1);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}