玄关。
#include<bits/stdc++.h>
// #pragma G++ optimize(2)
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int N=35,M=5005;
int sum[N],pos[N][M],ans[N];
ll dp[N][M];
struct data {
int id,val;
bool operator> (const data &B) const {
return val>B.val;
}
} a[N];
void work(int x,int y) {
if(!x) return;
for(int i=1;i<=x;i++) ans[i]++;
work(pos[x][y],y-x);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++) {cin>>a[i].val;a[i].id=i;}
sort(a+1,a+n+1,greater<data>());
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].val;
memset(dp,0x3f,sizeof(dp));dp[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=m;j++)
for(int k=0;k<=i;k++) {
int tmp=dp[k][j-i]+k*(sum[i]-sum[k]);
if(tmp<dp[i][j]) {dp[i][j]=tmp;pos[i][j]=k;}
}
cout<<dp[n][m]<<"\n";
work(n,m);
for(int i=1;i<=n;i++) cout<<ans[a[i].id]<<" ";cout<<"\n";
return 0;
}