Cod sursa(job #2193416)

Utilizator Constantin.Dragancea Constantin Constantin. Data 10 aprilie 2018 00:44:25
Problema Ghiozdan Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>
using namespace std;

int n, g, a[210], dp[2][75005], ap[75005];
bool u;

int main(){
    ifstream cin ("ghiozdan.in");
    ofstream cout ("ghiozdan.out");
    cin >> n >> g;
    for (int i=1, x; i<=n; i++) cin >> x, a[x]++;
    for (int i=1; i<=g; i++) dp[0][i] = dp[1][i] = 1e5;
    for (int i=1; i<=200; i++){
        if (!a[i]) continue;
        for (int j=1; j<=g; j++) dp[u][j] = dp[!u][j];
        for (int j=1; j<=a[i] && i*j<=g; j++){
            if (dp[u][j] == int (1e5)) dp[u][j*i] = j, ap[j*i] = i;
        }
        for (int j=i; j<=g; j++){
            if (dp[!u][j - min(j/i, a[i])*i] + min(j/i, a[i]) < dp[u][j]) dp[u][j] = dp[!u][j - min(j/i, a[i])*i] + min(j/i, a[i]), ap[j] = i;
        }
        u = !u;
    }
    int j = g;
    while (j && dp[!u][j] == 1e5) j--;
    cout << j << " " << dp[!u][j] << "\n";
    while (j>0){
        cout << ap[j] << "\n";
        j -= ap[j];
    }
    return 0;
}