Cod sursa(job #998842)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 18 septembrie 2013 14:03:29
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
#define inf 20001
int i,n,g,nr[201],s[75001],ob[75001],x,j,maxw,G,current[75001];
/*nr[i]=numarul de obiecte de greutate i
(deoarece intervalul de greutati este mult mai mic decat numarul maxim de obiecte
 iar un obiect este identificat numai prin greutatea sa, aceasta reprezentare este mult mai avantajoasa
 s[i]=numarul minim de obiecte ce pot forma greutatea i
 ob[i]= ultimul obiect ce a intrat in compopnenta greutatii i*/

int main ()
{
    fin>>n>>G;
    maxw=0;

    for (i=1;i<=n;i++)
    {
        fin>>x;
        nr[x]++;
        if (x>maxw) maxw=x;
    }

    s[0]=1;
    for (int w=maxw; w>=1; w--)
    {
        if (nr[w]==0) continue;

        for (int i=0; i<=G; ++i) current[i]=0;
        for (i=0; i<=G-w; ++i)
        {
            if (current[i]+1 > nr[w]) continue;
            if (s[i] && !s[i+w])
            {
                s[i+w] = s[i]+1;
                current[i+w]= current[i]+1;
                ob[i+w] = w;
            }
        }
    }
    for (i=G;;i--) if (s[i]) {fout<<i<<" "<<s[i]-1<<"\n"; break;}
    while (i)
    {
        fout<<ob[i]<<"\n";
        i=i-ob[i];
    }
}