Cod sursa(job #1045824)

Utilizator andi12Draghici Andrei andi12 Data 2 decembrie 2013 08:06:25
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include<fstream>
#include<algorithm>
using namespace std;
struct vm
{
    int cost;
    int pos;
};
struct fm
{
    int cost;
    bool pos;
};
int cmp(vm a,vm b)
{
    if(a.pos==b.pos)
    {
        if(a.cost<b.cost)
            return a.cost;
        else
            return b.cost;
    }
    else
        return a.pos<b.pos;
}
vm v[55005];
fm rucsac[55005];
int main()
{
    FILE *in,*out;
    in=fopen("energii.in","r");
    out=fopen("energii.out","w");
    int n,i,j,w,ras,ok,min;
    fscanf(in,"%d%d",&n,&w);
    for(i=1;i<=n;i++)
        fscanf(in,"%d%d",&v[i].pos,&v[i].cost);
    rucsac[0].pos=true;
    for(i=1;i<=n;i++)
    {
        for(j=20000-v[i].pos;j>=0;j--)
        {
            if(rucsac[j].pos==1)
            {
                if(rucsac[j+v[i].pos].pos==0)
                {
                    rucsac[j+v[i].pos].pos=1;
                    rucsac[j+v[i].pos].cost=rucsac[j].cost+v[i].cost;
                }
                else
                {
                    if(rucsac[j+v[i].pos].cost>rucsac[j].cost+v[i].cost)
                        rucsac[j+v[i].pos].cost=rucsac[j].cost+v[i].cost;
                }

            }
        }
    }
    ok=0;
    ras=w;
    min=999999999;
    while(ras<20000)
    {
        if(rucsac[ras].pos==1)
        {
            if(rucsac[ras].cost<min)
                min=rucsac[ras].cost;
        }
        ras++;
    }
    if(min!=999999999)
    fprintf(out,"%d",min);
    else
    fprintf(out,"-1");
    return 0;
}