Cod sursa(job #1506741)

Utilizator akaprosAna Kapros akapros Data 20 octombrie 2015 22:27:35
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 17
using namespace std;
int t, n, i, j, g, z[maxN + 2];
struct din
{
    int q;
    int nl;
}dp[(1 << maxN) + 2];
void rsw()
{
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);
    t = 3;
    while (t --)
    {
        scanf("%d %d", &n, &g);
        for (i = 0; i < n; ++ i)
            scanf("%d", &z[i]);
        memset(dp, 0, sizeof(dp));
        dp[0].nl = 1;
        dp[0].q = g;
        for (i = 1; i < 1 << n; ++ i)
            for (j = 0; j < n; ++ j)
                if (i & (1 << j))
            {
                if (dp[i].nl == 0 || dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q < z[j]) <= dp[i].nl)
                {
                    if (dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q == z[j]) <= dp[i].nl)
                    {
                        if (dp[i ^ (1 << j)].q >= z[j] && dp[i ^ (1 << j)].q - z[j] >= dp[i].q)
                            dp[i].q = dp[i ^ (1 << j)].q - z[j];
                        else
                         if (dp[i ^ (1 << j)].q < z[j] && g - z[j] >= dp[i].q)
                             dp[i].q = g - z[j];
                        continue;
                    }
                    dp[i].nl = dp[i ^ (1 << j)].nl + (dp[i ^ (1 << j)].q < z[j]);
                    if (dp[i ^ (1 << j)].q >= z[j])
                        dp[i].q = dp[i ^ (1 << j)].q - z[j];
                    else
                        dp[i].q = g - z[j];
                }
            }
        printf("%d\n", dp[(1 << n) - 1].nl);
    }
}
int main()
{
    rsw();
    return 0;
}