Cod sursa(job #1729774)

Utilizator LucianTLucian Trepteanu LucianT Data 15 iulie 2016 16:49:48
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
#define maxN 205
#define maxxx 75005
using namespace std;
int n,i,j,g,x,ob,sol;
int fr[maxN],dp[maxxx],a[maxxx];
class InputReader
{
public:
    InputReader() {}
    InputReader(const char *file_name)
    {
        input_file = fopen(file_name, "r");
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n)
    {
        while(buffer[cursor] < '0' || buffer[cursor] > '9')
        {
            advance();
        }
        n = 0;
        while('0' <= buffer[cursor] && buffer[cursor] <= '9')
        {
            n = n * 10 + buffer[cursor] - '0';
            advance();
        }
        return *this;
    }
private:
    FILE *input_file;
    static const int SIZE = 1 << 17;
    int cursor;
    char buffer[SIZE];
    inline void advance()
    {
        ++ cursor;
        if(cursor == SIZE)
        {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
    }
};
int main()
{
    InputReader f("ghiozdan.in");
    freopen("ghiozdan.out","w",stdout);
    f>>n>>g;
    for(i=1;i<=n;i++)
        f>>x,fr[x]++;
    dp[0]=1,sol=g;
    for(i=200;i>=1;i--)
        if(fr[i])
            for(j=g-i;j>=0;j--)
            if(dp[j])
                for(ob=1;ob<=fr[i] && j+ob*i<=g;ob++)
                    if(dp[j+ob*i]==0)
                    dp[j+ob*i]=dp[j]+ob,a[j+ob*i]=i;
                    else break;
    while(!dp[sol])
        sol--;
    printf("%d %d\n",sol,dp[sol]-1);
    while(dp[sol]!=1)
        printf("%d\n",a[sol]),sol-=a[sol];
    return 0;
}