Cod sursa(job #922439)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 22 martie 2013 10:25:13
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#define N 75004
#define max(a,b) (((a)>=(b))?(a):(b))
using namespace std;
int sol[N],ult[N],ap[220];
/*
sol[i] = numarul minim de obiecte selectate pentru a obtine suma i
ult[i] = ultimul numar adaugat pentru a obtine suma i
ap[i]  = numarul de aparitii a numarului i la citire
*/
int n,G,gmax;
ofstream fout("ghiozdan.out");
void Citire()
{
    int i,x;
    ifstream fin("ghiozdan.in");
    fin>>n>>G;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        gmax = max(gmax,x);
        ap[x]++;
    }
    fin.close();
}

void Dinamic()
{
    int i,j,k;
    sol[0] = 1;//ca sa putem forma mai usor sumele
    for(i=gmax;i>0;i--)
        if(ap[i])//daca mumarul i apare in vector
            for(j=G-i;j>=0;j--)
                if(sol[j])//daca putem forma suma j
                    for(k=1;k<= ap[i] &&  j+k*i<=G && sol[j+k*i]==0 ;k++)
                    {
                        sol[j+k*i] = sol[j]+k;
                        ult[j+k*i] = i;
                    }
}

void Afisare()
{
    int i;
    for(i=G;i>0;i--)
        if(sol[i])
        {
            fout<<i<<" "<<sol[i]-1<<"\n";
            while(i)
            {
                fout<<ult[i]<<"\n";
                i = i- ult[i];
            }
        }
    fout.close();
}

int main()
{
    Citire();
    Dinamic();
    Afisare();
    return 0;
}