Cod sursa(job #1953604)

Utilizator GinguIonutGinguIonut GinguIonut Data 4 aprilie 2017 21:51:21
Problema Ghiozdan Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>

#define INF 10000000
#define pb push_back
#define nMax 20001

#define gMax 75001
#define gEachMax 201

using namespace std;

ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");

int n, G, val;
int dp[gMax], frecv[gEachMax], last[gMax], gObiect[gMax];
vector<int> Sol;

int main()
{
    int val;
    fin>>n>>G;
    for(int i=1; i<=n; i++)
    {
        fin>>val;
        frecv[val]++;
    }
    for(int i=1; i<gEachMax; i++)
        dp[i]=INF;
    for(int i=gEachMax-1; i>=1; i--)
        if(frecv[i]!=0)
            for(int j=G-i; j>=0; j--)
                if(dp[j]!=INF)
                    for(int k=1; k<=frecv[i] && j+i*k<=G; k++)
                        if(dp[j+i*k]==INF)
                            dp[j+i*k]=dp[j]+k, last[j+i*k]=j, gObiect[j+i*k]=k;
    for(int i=G; i>=1; i--)
    {
        if(dp[i]!=INF)
        {
            fout<<i<<" ";
            while(i)
            {
                int obiect=(i-last[i])/gObiect[i];
                while(gObiect[i])
                {
                    Sol.pb(obiect);
                    gObiect[i]--;
                }
                i=last[i];
            }
            break;
        }
    }

    fout<<Sol.size()<<'\n';
    for(vector<int>::iterator it=Sol.begin(); it!=Sol.end(); it++)
        fout<<*it<<'\n';
}