///dp[i][j][0] 表示前i列涂了j个red且第j列是red得到最少的valul
//dp[i][j][1]表示第i列涂了j个red且第j列是green得到的最少的value
//dp[i][j][0] = min(dp[i-1][j-h[i]][0] , dp[i][j][1] + min(h[i-1] ,h[i]))
//dp[i][j][1] = min(dp[i-1][j][0] + min(h[i-1],h[i]) ,dp[i][j][1])
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int inf = 0x3f3f3f3f;
const int maxn = 210 ;
int dp[maxn][maxn*maxn][2]; //dp[i][j][0] 表示第i列去了j个a且第j列是a得到最少的value
int sum[maxn];
int h[maxn];
int Min(int a ,int b)
{
if(a == -1)
return b;
if(b == -1)
return a;
return min(a,b);
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n , a, b;
while(~scanf("%d" ,&n))
{
scanf("%d%d" ,&a ,&b);
sum[0] = 0 ;
for(int i = 1;i <= n;i++)
scanf("%d" ,&h[i]) , sum[i]=sum[i-1]+h[i];
memset(dp , -1 , sizeof(dp));
if(h[1] <= a)
dp[1][h[1]][0] = 0;
if(h[1] <= b)
dp[1][0][1] = 0 ;
for(int i = 1;i < n;i++)
{
if(sum[i] <= b)
dp[i][0][1] = 0;
for(int j = 0;j <= a;j++)
{
if(dp[i][j][0] != -1)
{
if(j+h[i+1] <= a)
dp[i+1][j+h[i+1]][0] = Min(dp[i+1][j+h[i+1]][0] , dp[i][j][0]);
if(sum[i+1] - j <= b)
dp[i+1][j][1] = Min(dp[i+1][j][1] , dp[i][j][0] + min(h[i] ,h[i+1]));
}
if(dp[i][j][1] != -1)
{
if(j+h[i+1] <= a)
dp[i+1][j+h[i+1]][0] = Min(dp[i+1][j+h[i+1]][0] , dp[i][j][1] + min(h[i] ,h[i+1]));
if(sum[i+1] - j <= b)
dp[i+1][j][1] = Min(dp[i+1][j][1] , dp[i][j][1]);
}
}
}
int ans = inf ;
for(int i = 0;i <= a;i++)
ans = Min(Min(ans ,dp[n][i][0]) , dp[n][i][1]);
if(ans == inf)puts("-1");
else printf("%d\n",ans);
}
}