Pagini recente » Cod sursa (job #1139332) | Cod sursa (job #1314224) | Cod sursa (job #1922251) | Cod sursa (job #2184267) | Cod sursa (job #2193413)
#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;
}