Pagini recente » Cod sursa (job #1751657) | Cod sursa (job #1639620) | Cod sursa (job #264785) | Cod sursa (job #2032920) | Cod sursa (job #2431453)
#include <bits/stdc++.h>
using namespace std;
const int MXW = 75005;
long long dp1[2][MXW], dp2[2][MXW];
const long long scale = 2e4 + 1;
int w[scale];
long long *solve(long long dp[2][MXW], int s, int e, int rem) {
memset(dp[!(s & 1)], 0, (rem + 1) * sizeof(dp[0][0]));
for (int i = s; i <= e; ++i) {
for (int r = 1; r <= rem; ++r) {
long long &res = dp[i & 1][r];
int id = !(i & 1);
res = dp[id][r];
if (w[i] <= r) res = max(res, dp[id][r - w[i]] + scale * w[i] - 1);
}
}
return dp[e & 1];
}
void hirschberg(int s, int e, int rem) {
if (s == e) {
if (w[s] <= rem) printf("%d\n", w[s]);
return;
}
if (e < s || rem == 0) return;
int mid = (s + e) / 2;
long long *d1 = solve(dp1, s, mid, rem);
long long *d2 = solve(dp2, mid + 1, e, rem);
long long best = 0;
int bestr;
for (int r = 0; r <= rem; ++r) {
long long v = d1[r] + d2[rem - r];
if (v > best) {
best = v;
bestr = r;
}
}
hirschberg(s, mid, bestr);
hirschberg(mid + 1, e, rem - bestr);
}
int main() {
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out" , "w" , stdout) ;
int n, k;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; ++i) scanf("%d", w + i);
long long v = solve(dp1, 0, n - 1, k)[k];
printf("%lld %lld\n", v / scale + 1, -(v % scale - scale));
hirschberg(0, n - 1, k);
}