Cod sursa(job #2193413)

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

int n, g, a[210];
struct lol{
    int nr, cnt, last;
} dp[205][75005];

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=0; i<=200; i++){
        for (int j=1; j<=g; j++) dp[i][j] = {int (1e5), 0, 0};
    }
    for (int i=1; i<=200; i++){
        for (int j=1; j<=a[i] && i*j<=g; j++) dp[i][j*i] = {j, j, 0};
        for (int j=1; j<=g; j++){
            if (dp[i-1][j].nr < dp[i][j].nr) dp[i][j] = {dp[i-1][j].nr, 0, i-1};
            if (a[i] && j/i){
                if (dp[i-1][j - min(j/i, a[i])*i].nr + min(j/i, a[i]) < dp[i][j].nr) dp[i][j] = {dp[i-1][j - min(j/i, a[i])*i].nr + min(j/i, a[i]), min(j/i, a[i]), i-1};
            }
        }
    }
    int i = 200, j = g;
    while (j && dp[200][j].nr == 1e5) j--;
    cout << j << " " << dp[200][j].nr << "\n";
    while (i){
        int kk = dp[i][j].cnt;
        for (int k=1; k <= kk; k++) cout << i << "\n";
        j -= i*kk; i = dp[i][j+kk*i].last;
    }
    return 0;
}