Cod sursa(job #338543)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 august 2009 23:02:58
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.5 kb
#include <cstdio>      
#include <algorithm>   
  
using namespace std;   
  
#define Gmax 75011   
#define Nmax 20101   
#define Inf 0x3f3f3f3f    
  
int n,g,v[Nmax],s[Gmax],sol[Gmax];      
     
int maxim(int a, int b)   
{   
    if (a>b) return a;   
    return b;   
}   
  
int cmp(int a, int b)   
{   
    return (a>b);   
}   
  
void read_data()      
{      
    freopen("ghiozdan.in","r",stdin);      
    freopen("ghiozdan.out","w",stdout);      
  
    scanf("%d %d", &n, &g);      
    for (int i=1;i<=n;++i)      
        scanf("%d", &v[i]);      
    sort(v+1,v+n+1,cmp);   
    for (int i=1;i<=g;++i)      
        s[i]=Inf;      
}      
     
void solve()      
{      
    int lmax=0;      
    for (int i=1;i<=n && s[g]==Inf;++i)      
    {      
        lmax+=v[i];      
        lmax>g?lmax=g:0;      
        for (int j=lmax;j>=v[i];--j)      
            if (s[j]>s[j-v[i]]+1)      
            {      
                s[j]=s[j-v[i]]+1;      
                sol[j]=v[i];      
            }      
    }      
    int k,ok=0;         
    k=g;         
    while(!ok)                
    {         
      if (s[k]==Inf) --k;         
      else        
      ok=1;         
    }         
  
    printf("%d %d\n", k,s[k]);   
    g=k;   
    while(g)   
    {   
        printf("%d\n", sol[g]);   
        g-=sol[g];   
    }   
}      
     
int main()      
{      
    read_data();      
    solve();      
    return 0;      
}