Cod sursa(job #2408069)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 17 aprilie 2019 16:31:30
Problema Ghiozdan Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");
int N, W;
int frq[202];
int dp[80002], fw[80002], prv[80002];
bool gg[80002];
vector<int>ans;
int ct = -1;
int main()
{
    f >> N >> W;
    for(int i = 1; i <= N; ++i)
    {
        int x;
        f >> x;
        frq[x]++;
    }
    gg[0] = 1;
    for(int i = 1; i <= 200; ++i)
    {
        int qt = 1;
        int mmx = 0;
        while(frq[i])
        {
            mmx = 0;
            int nc = 0;
            if(frq[i] >= qt)
                nc = qt, frq[i] -= qt;
            else
                nc = frq[i], frq[i] = 0;
            for(int j = W - i * nc; j >= 0; --j)
                if(gg[j] && (!gg[j + i * nc] || dp[j] + nc < dp[j + i * nc]))
                {
                    mmx = max(mmx, j + i * nc);
                    gg[j + i * nc] = 1;
                    dp[j + i * nc] = dp[j] + nc;
                    fw[j + i * nc] = j;
                }
            qt *= 2;
            int j = mmx;
            if(ct < j || (ct == j && dp[j] < ans.size()))
            {
                ans.clear();
                ct = j;
                while(j)
                {
                    for(int q = 1; q <= dp[j] - dp[fw[j]]; ++q)
                        ans.push_back((j - fw[j]) / (dp[j] - dp[fw[j]]));
                    j = fw[j];
                }
            }
        }
    }
    g << ct << " " << ans.size() << '\n';
    for(int i = 0; i < ans.size(); ++i)
        g << ans[i] << '\n';
    return 0;
}