Cod sursa(job #907213)

Utilizator CrescentselectJicol Crescent Crescentselect Data 7 martie 2013 18:41:26
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<iostream>
#include <fstream>
#include<algorithm>
#include<vector>

using namespace std;

#define N 20001
# define M 500001
ifstream f ("ghiozdan.in");
ofstream g ("ghiozdan.out");

int v[M];
int prev[M];
int sum[M];
int n,G,s,k,s1,s2,maxim;

void citire()
{
    f>>n>>G;
    for( int i=1;i<=n;i++)
    {
        f>>v[i];
        s+=v[i];
    }
    sort(v+1,v+n+1);
    for( int i=1;i<=500000;i++)
        sum[i] = 3000000;
}
void proces()
{
    for( int i=1;i<=n;i++)
    {
        for(int j=G-v[i];j>0;j--)
        {
            if(sum[j] != 3000000)
            {
                if(sum[j+v[i]] > sum[j]+1) {
                    sum[j+v[i]] = sum[j]+1;
                    prev[j+v[i]] = v[i];
                }
            }
        }
        if(v[i] <= G) {
            sum[v[i]] = 1;
        }
    }
    for( int i=G;i>0;i--)
    {
        if(sum[i]>0 && sum[i] != 3000000)
        {
            g<<i<<" "<<sum[i]<<endl;

            vector<int> v;

            while(i > 0 && prev[i] != 0) {
                v.push_back(prev[i]);
                i -= prev[i];
            }
            if(i > 0) {
                v.push_back(i);
            }

            for( int i= v.size()-1; i>=0;i--)
            {
                g<<v[i]<<'\n';
            }

            break;
        }
    }
}

int main()
{
    citire();
    proces();
    return 0;
}