Cod sursa(job #3033123)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 23 martie 2023 13:31:07
Problema Ghiozdan Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
#define GMAX 75005
#define OBJMAX 205
using namespace std;

int freq[OBJMAX];
int dp[GMAX];
pair<int, int> sol[GMAX];

void print_sol(int i) {
	cout << i << ' ' << dp[i] << '\n';
	while (i) {
		int s = sol[i].first * sol[i].second;

		while (sol[i].second) {
			--sol[i].second;
			cout << sol[i].first << '\n';
		}

		i -= s;
	}
}

void solve()
{
	int n, g;
	cin >> n >> g;

	for (int i = 1, x; i <= n; ++i) {
		cin >> x;
		++freq[x];
	}

	for (int i = 200; i >= 1; --i) {

		if (!freq[i])
			continue;

		for (int j = g - i; j >= 0; --j) {

			if (!dp[j] && j)
				continue;

			for (int k = 1; k <= freq[i] && i * k + j <= g; ++k) {
				if (dp[i * k + j])
					break; // not optimal, more elements in this way

				dp[i * k + j] = dp[j] + k;
				sol[i * k + j] = {i, k};
			}
		}
	}
	for (int i = g; i > 0; --i) {
		if (dp[i]) {
			print_sol(i);
			return;
		}
	}
}

int main()
{
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);

	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int t = 1;
	// cin >> t;
	while(t--)
		solve();

	return 0;
}