Cod sursa(job #874758)

Utilizator cat_red20Vasile Ioana cat_red20 Data 9 februarie 2013 11:43:46
Problema Ghiozdan Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define MAXN 20001
#define MAXG 75001
using namespace std;
int v[MAXN],n,gmax;

struct greutati
{
    int nr;
    int sol[201];
}g[MAXG];

void citire()
{
    freopen("ghiozdan.in","r",stdin);
    scanf("%d %d",&n,&gmax);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
    }
}

void initializare()
{
    for(int i=1;i<=gmax;i++)
    {
        g[i].nr=MAXN;
    }
}

void rucsac()
{
    initializare();
    for(int i=n;i>=1;i--)
    {
        for(int j=gmax-v[i];j>=0;j--)
        {
            if(g[j].nr!=MAXN)
            {
                if(g[j+v[i]].nr>g[j].nr+1)
                {
                    g[j+v[i]].nr=g[j].nr+1;
                    memcpy(g[j+v[i]].sol,g[j].sol,sizeof(g[j].sol));
                    g[j+v[i]].sol[v[i]]++;
                }

            }
        }
    }
}

void reconst(int p)
{
   for(int i=1;i<=200;i++)
   {
       for(int j=1;j<=g[p].sol[i];j++)
       {
           printf("\n%d",i);
       }
   }
}

void afisare()
{
    freopen("ghiozdan.out","w",stdout);
    for(int i=gmax;i>=0;i--)
    {
        if(g[i].nr!=MAXN)
        {
            printf("%d %d",i,g[i].nr);
            reconst(i);
            break;
        }
    }
}

int main()
{
    citire();
    sort(v+1,v+n+1);
    rucsac();
    afisare();
    return 0;
}