Cod sursa(job #1963409)

Utilizator danstefanDamian Dan Stefan danstefan Data 12 aprilie 2017 15:05:55
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
///dp[i]-numarul minim de obiecte pt a obtine suma i
///last[i]-greutatea ultimului obiect pus pt a obtine suma i
#include <bits/stdc++.h>
using namespace std;
int n,G,i,x,ap[210],last[75010],dp[75010],j,k;
int main()
{
    ifstream f ("ghiozdan.in");
    ofstream g ("ghiozdan.out");
    f>>n>>G;
    for(i=1; i<=n; ++i)
    {
        f>>x;
        ap[x]++;
    }
    dp[0]=1;
    for(i=200; i>=1; i--)
        if(ap[i])
            for(j=G-i; j>=0; --j)
                if(dp[j])
                    for(k=1; k<=ap[i]; ++k)
                    {
                        if(j+k*i>G||dp[j+k*i])break;
                        dp[j+k*i]=dp[j]+k;
                        last[j+k*i]=i;
                    }
    for(i=G; i>=1; --i)
        if(dp[i])
        {
            g<<i<<" "<<dp[i]-1<<'\n';
            while(i)
            {
                g<<last[i]<<'\n';
                i-=last[i];
            }
            return 0;
        }
    return 0;
}