Cod sursa(job #2822655)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 24 decembrie 2021 18:09:09
Problema Zebughil Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, g;
int v[20];
int dp[(1 << 17)][505];
/// dp[i][j] = numarul minim de camioane astfel incat sa putem transporta
/// blocurile identificate de bitii de 1 din reprezentarea in baza 2 a lui i
/// iar ultimul camion sa fie plin pana la capacitatea j

int main()
{
    int t = 3;
    while(t--)
    {
        fin >> n >> g;
        for(int i = 0; i < n; i ++)
        {
            fin >> v[i];
        }
        for(int i = 1; i < (1 << n); i ++)
        {
            for(int j = 0; j <= g; j ++)
            {
                dp[i][j] = INT_MAX;
            }
        }
        for(int i = 0; i < n; i ++)
        {
            dp[(1 << i)][v[i]] = 1;
        }
        for(int mask = 1; mask < (1 << n); mask ++)
        {
            for(int i = 0; i < n; i ++)
            {
                int val = mask & (1 << i);
                if(val == 0)
                {
                    for(int j = 0; j <= g; j ++)
                    {
                        if(dp[mask][j] == INT_MAX)
                        {
                            continue;
                        }
                        if(j + v[i] <= g)
                        {
                            dp[mask + (1 << i)][j + v[i]] = min(dp[mask + (1 << i)][j + v[i]], dp[mask][j]);
                        }
                        else
                        {
                            dp[mask + (1 << i)][v[i]] = min(dp[mask + (1 << i)][v[i]], 1 + dp[mask][j]);
                        }
                    }
                }
            }
        }
        int ans = INT_MAX;
        for(int i = 1; i <= g; i ++)
        {
            ans = min(ans, dp[(1 << n) - 1][i]);
        }
        fout << ans << '\n';
    }
    return 0;
}