Cod sursa(job #1866816)

Utilizator l-teenLucian l-teen Data 3 februarie 2017 15:58:36
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
// En.cpp : Defines the entry point for the console application.
//

#include <stdio.h>

unsigned int G, W, e[1000], c[1000], mincost[5001], min = -1;
unsigned char available[5001][125];

int main()
{
    FILE *in, *out;

    int i, curren, j;

    if (!(in = fopen("energii.in", "r")))
        return -1;

    if (!fscanf(in, "%d %d", &G, &W))
        return -1;

    for (i = 0; i < G; ++i)
        if (!fscanf(in, "%d %d", &e[i], &c[i]))
            return -1;

    for (i = 0; i < G; ++i)
        if ((mincost[e[i]]>c[i]) || (!mincost[e[i]]))
        {
            mincost[e[i]] = c[i];
            for (j = 0; j < G / 8; ++j)
                available[e[i]][j] = 0xFF;
            available[e[i]][G / 8] = 0xFF << (8 - G%8);
            available[e[i]][i / 8] &= ~(1 << (7 - i % 8));
            if (((min == -1) || (min > mincost[e[i]])) && (e[i] >= W))
                min = mincost[e[i]];
        }

    for (curren = 1; curren < W;++curren)
        if (mincost[curren])
        {
            for (i = 0; i < G; ++i)
            {
                if (available[curren][i / 8] & (1 << (7 - i % 8)) == (1 << (7 - i % 8)))
                    if ((mincost[curren + e[i]]>mincost[curren] + c[i]) || (!mincost[curren + e[i]]))
                    {
                        mincost[curren + e[i]] = mincost[curren] + c[i];
                        for (j = 0; j < G / 8; ++j)
                            available[curren + e[i]][j] = available[curren][j];
                        available[curren + e[i]][G / 8] = available[curren][G / 8];
                        available[curren + e[i]][i / 8] &= ~(1 << (7 - i % 8));
                        if (((min == -1) || (min > mincost[curren + e[i]])) && (curren + e[i] >= W))
                            min = mincost[curren + e[i]];
                    }
            }
        }

    if (!(out = fopen("energii.out", "w")))
        return -1;

    if (!fprintf(out, "%d", min))
        return -1;

	return 0;
}