#include using namespace std; vector S; int dp[114][514]; int dfs(int sinka,int kakusei){ if( dp[sinka][kakusei] != -1 ) return dp[sinka][kakusei]; if( kakusei > S[sinka] ) return 1e9; if( sinka == 0 ){ if( kakusei == 0 ) return 1; return dfs(sinka,kakusei-1) + 1; }else{ int answer = 1e9; answer = min( dfs(sinka-1,kakusei)+1,answer); if( kakusei ){ for(int i = 0 ; i < kakusei ; i++) answer = min( dfs(sinka,kakusei-i-1)+dfs(sinka,i), answer ); } return dp[sinka][kakusei] = answer; } } int main(){ memset(dp,-1,sizeof(dp)); int N; cin >> N; S = vector(N+1); for(int i = 0 ; i <= N ; i++) cin >> S[i]; for(int i = 0 ; i <= S[N] ; i++) cout << dfs(N,i) << (i==S[N]?"\n":" "); }