Pagini recente » Cod sursa (job #2115535) | Cod sursa (job #394368) | Cod sursa (job #394374) | Cod sursa (job #1701033) | Cod sursa (job #3334776)
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int n, g;
vector<int> dp, fr, par;
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> n >> g;
fr.resize(200 + 5);
dp.assign(g + 5, inf);
par.resize(g + 5);
int maxi = -1;
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
fr[x] ++;
maxi = max(maxi, x);
}
dp[0] = 0;
for(int i = maxi; i >= 1; i --)
{
int f = fr[i];
int p = 1;
if(f == 0)
continue;
while(f)
{
for(int j = g; j >= p * i; j --)
if(dp[j] > dp[j - p * i] + p)
{
dp[j] = dp[j - p * i] + p;
par[j] = j - i;
}
f -= p;
p = (p * 2 > f ? f : p * 2);
}
}
int ans = 0, cur;
for(int i = g; i >= 0; i--)
if(dp[i] != inf)
{
cur = i;
ans = dp[i];
break;
}
cout << cur << " " << ans << '\n';
vector<int> retriv;
while(cur)
{
retriv.push_back(cur - par[cur]);
cur = par[cur];
}
reverse(retriv.begin(), retriv.end());
for(auto i : retriv)
cout << i << '\n';
return 0;
}